首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >虚拟继承中构造函数调用的顺序是什么?

虚拟继承中构造函数调用的顺序是什么?
EN

Stack Overflow用户
提问于 2018-03-16 05:13:59
回答 2查看 0关注 0票数 0
代码语言:txt
复制
class A {
        int i;
public: 
        A() {cout<<"in A's def const\n";};
        A(int k) {cout<<"In A const\n";  i = k; }
        };

class B : virtual public A {
public:
        B(){cout<<"in B's def const\n";};
        B(int i) : A(i) {cout<<"in B const\n";}
        };

class C :   public B {
public:
        C() {cout<<"in C def cstr\n";}
        C(int i) : B(i) {cout<<"in C const\n";}
        };

int main()
{
        C c(2);
        return 0;
}

本例中的输出是

代码语言:txt
复制
in A's def const
in B const
in C const

为什么它需要def构造函数呢?

EN

回答 2

Stack Overflow用户

发布于 2018-03-16 13:15:59

虚拟基类的构造函数总是从大多数派生类中调用,使用它可能传入的任何参数。在你的情况下,大多数派生类没有指定初始化器A,因此使用默认构造函数。

票数 0
EN

Stack Overflow用户

发布于 2018-03-16 14:14:37

virtual继承的情况下,它是调用虚拟基类的构造函数的派生类。所以,如果你想要A一个整数被调用的构造函数,你需要将它添加到C初始化列表中。

代码语言:javascript
复制
C(int i) : A(i), B(i) {cout<<"in C const\n";}

对于问题的第二部分,缺省构造函数不是必需的,但派生类必须显式调用非缺省构造函数,因为编译器无法在没有非缺省构造函数的情况下为您执行此操作。

代码语言:javascript
复制
#include <iostream>
using namespace std;

class A {
  int i;
public:
  // A() {cout<<"in A's def const\n";};
  A(int k) {cout<<"In A const\n";  i = k; }
};

class B : virtual public A {
public:
  // B(){cout<<"in B's def const\n";};
  B(int i) : A(i) {cout<<"in B const\n";}
};

class C :   public B {
public:
  C() : A(42), B(42) {cout<<"in C def cstr\n";}
  C(int i) : A(i), B(i) {cout<<"in C const\n";}
};

int main()
{
  C c(2), c2;
  return 0;
}

输出:

代码语言:javascript
复制
In A const
in B const
in C const
In A const
in B const
in C def cstr
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003631

复制
相关文章

相似问题

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