首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多路径继承和

多路径继承和
EN

Stack Overflow用户
提问于 2013-07-23 15:46:02
回答 2查看 1.6K关注 0票数 0

在下面的代码中,使用Virtual Class解析了Multi Path Inheritance,构造函数是如何工作的?构造函数不能是继承的,也不能是虚的或静态的。

代码语言:javascript
复制
/*Multi Path Inheritance*/

class A{

public:
    int a;
    A(){
        a=50;
    }
};


class B:virtual public A{

public:
    /*B(){
        a = 40;
    }*/

};

class C:virtual public A{

public:
    /*C(){
        a = 30;
    }*/

};

class E:virtual public A{

public:
    E(){
        a = 40;
    }

};

class D : public B, public C, public E{

public:
    D(){
        cout<<"The value of a is : "<<a<<endl;  
    }

};

int main(int argc, char *argv[]){

    D d;
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-23 15:50:04

你可以找到很多关于虚拟继承here的信息和例子(是的,它实际上在msdn上,多么奇怪:)

至于构造函数,构造函数在你指定的时候被调用。如果没有指定对virtua基类构造函数调用,

类继承层次结构中任何位置的虚拟基类的

构造函数都由“最多派生的”类的构造函数调用。

(请阅读here)。

票数 1
EN

Stack Overflow用户

发布于 2013-07-23 16:46:23

基于来自标准12.6.2/10的以下配额,因此构造函数体将按以下顺序调用: A->B->C->D,因此a的最终值将是40。

在非委托构造函数中,初始化按以下顺序进行:

-首先,并且仅对于最派生类(1.8)的构造函数,虚拟基类按照它们在基类的有向无环图的深度优先从左向右遍历时出现的顺序进行初始化,其中“从左到右”是基类在派生类基说明符列表中的出现顺序。-然后,直接基类按照它们在base-specifier-list中出现的声明顺序进行初始化(不管mem-initializers的顺序如何)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17804293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档