首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-18 
虚拟继承下访问virtual函数出错#includeiostreamusingnamespacestdclassVBase{public:voidfun(){cout

虚拟继承下访问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都有这个名字,编译器不知道该调用哪个的问题”。

热点排行