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

请教多次多重继承的有关问题

2013-04-02 
请问多次多重继承的问题我运行上面程序是不行的,但是当我将每个继承都改为virtual public继承,是可以运行

请问多次多重继承的问题


我运行上面程序是不行的,但是当我将每个继承都改为virtual public继承,是可以运行的,但是构造函数运行结果也不是我从网上找的c++primer答案那样(Class->Base()->Derived1()->Derived2()->MI()->Class()->Final()),运行的顺序中没有第二次的Class()。 求大牛解答。可以运行的程序如下:
#include<iostream>
using namespace std;
class Class
{
public:
    Class(){cout<<"Class()"<<endl;}
};
class Base:virtual public Class
{
public:
    Base():Class(){cout<<"Base()"<<endl;}
};
class Derived1:virtual public Base
{
public:
    Derived1():Base(){cout<<"Derived1()"<<endl;}
};
class Derived2:virtual public Base
{
public:
    Derived2():Base(){cout<<"Derived2()"<<endl;}
};
class MI:virtual public Derived1,virtual public Derived2
{
public:
    MI():Base(),Derived1(),Derived2(){cout<<"MI()"<<endl;}
};

class Final:virtual public MI,virtual public Class
{
public:
    Final(){cout<<"Final()"<<endl;}
};

int main()
{
    Final f1;
}
多次多重继承 c++
[解决办法]
此外,虚基类的构造是由最终派生类进行的,所以在第一种做法中,Base的构造不应由MI负责,而应由Final负责;而在第二种做法中,基于同样的原因,Base和Class的构造也应由Final负责。
[解决办法]
C++标准没有规定多重继承下各个父类的构造次序,所以,就算调低编译器警告级别之后可以运行,也不能保证一定是Class->Base()->Derived1()->Derived2()->MI()->Class()->Final()。第二个Class可以插到Class->Base()->[Derived1(), Derived2()]->MI()->Final()中间的任何位置,Derived1()和Derived2()也可交换。

热点排行