c++ 类的多承继承中,第一层的父类中的虚函数

像这样子跟主函数写到一块不会出错。classR1{public:virtualvoidprint(){cout<<"r"<<endl;}};classA1:publicv... 像这样子跟主函数写到一块不会出错。

class R1{
public:
virtual void print(){
cout<<"r"<<endl;
}
};
class A1:public virtual R1{
public:
void print(){
cout<<"A"<<endl;
}

};
class B1:public virtual R1{
public:
void print(){
cout<<"B"<<endl;
}

};
class C1:public A1,public B1{
public:
void print(){
cout<<"C"<<endl;
}
};
但当我把几个类分开写到 几个头文件中 在C类继承的时候会出错。提示c类中的R1::print()不止一个 这是怎么回事啊? 环境是xcode
不是头文件的问题,是C类中没有 写print 会产生上面说的错误?
那到底是怎么回事?
虚继承是 在这里是应该先继承R中的成员,再继承 A,B中派生出来的成员,那 a中的print()跟b 中的print是 属于他们派生出来的吗?在继承的过程又是怎么执行的呢?
展开
 我来答
键盘未找到
2015-08-16 · TA获得超过328个赞
知道小有建树答主
回答量:403
采纳率:100%
帮助的人:266万
展开全部

  你的问题是C++中的多继承机制导致的 菱形继承问题(如下图所示) 的一个特例。

  1. 菱形问题是指R1中的成员在C1中会有两个拷贝。

  2. 当A1、B1使用virtual来继承R1时,菱形问题得到解决。


  3. 当A1、B1分别重载实现了R1中的相同的成员函数时,问题又来了:

  C1中有两个签名完全相同的函数,分别来自A1(void A1::print( ) )、B1(void B1::print( ) ),当C1对象调用print时,是调用 A1::print 还是 B1::print? 无法判断。


  4. 如果C1中也实现了 void print( )函数,那么C1对象调用print时自然会调用C1::print( ),问题得以解决。这也是为什么“C类中没有 写print 会产生上面说的错误”的原因。

卖蘑菇的灰太狼
2015-08-15
知道答主
回答量:11
采纳率:0%
帮助的人:7.1万
展开全部
你这样会有动态绑定,试试每个print()都写成虚函数。
追问
不是头文件的问题,是C类中没有 写print 会产生上面说的错误?
那到底是怎么回事?
虚继承是 在这里是应该先继承R中的成员,再继承 A,B中派生出来的成员,那 a中的print()跟b 中的print是 属于他们派生出来的吗?在继承的过程又是怎么执行的呢?
追答
这个过程是先继承的,A的print也是自己的,但是调用的时候编译器看到基类中有就不看派生类了,我自己理解的。http://blog.csdn.net/dqjyong/article/details/8029527,你自己看看,有什么不懂的再问,希望对你有帮助~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式