读书人

虚拟继承下访问virtual函数出错,该怎么

发布时间: 2012-03-18 13:55:39 作者: rapoo

虚拟继承下访问virtual函数出错
#include <iostream>
using namespace std;

class VBase
{
public:
void fun()
{
cout < < "VBase::fun " < < endl;
}
};

class Der1 : virtual public VBase
{
public:
void fun()
{
cout < < "Der1::VBase " < < endl;
}
};

class Der2 : virtual public VBase
{
public:
void fun()
{
cout < < "Der2::VBase " < < endl;
}
};

class Inherit : public Der1, public Der2
{
public:
/*void fun()
{
cout < < "Herit::fun " < < endl;
}*/
};

int main()
{
Inherit *m = new Inherit ;
m-> fun();
return 0;
}

上面的代码编译的话会出错,提示说m-> fun()函数可能指向Der1::fun()或Der2::fun()

多态还会选择错误???

照我的理解是,Inherit的构造函数先初始化自身里面的VBase对象,设置里面的vptr的值
然后初始化Der1对象,相应设置vptr的值
最后是初始化Der2对象,相应设置vptr的值

然后在设定自己的vptr值,虽然说它的的fun函数的指向不明确
可它总应有个指向的位置吧
难道一个slot的位置可以指向两个位置不成???

[解决办法]
函数名解析和虚函数无关。具体看C++ Primer“重载解析过程和继承”这章节。3e是19.3章节,中文版是P859。
[解决办法]
考effective C++ 条款26: 当心潜在的二义性
[解决办法]
> > 然后在设定自己的vptr值,虽然说它的的fun函数的指向不明确
> > 可它总应有个指向的位置吧
> > 难道一个slot的位置可以指向两个位置不成???

首先,你这程序里连半个虚函数都没有,哪来的slot?
其次,即便你的fun从最开始就定义为virtual的,也不行。
你既然把最终类自己的那个注释掉了,那就只能使用两个父类之一的。因此,根本不是你所理解的“一个slot可以指向两个位置”的问题,而是“两个以上的slot都有这个名字,编译器不知道该调用哪个的问题”。

读书人网 >C++

热点推荐