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