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;
}
本例中的输出是
in A's def const
in B const
in C const
为什么它需要def构造函数呢?
发布于 2018-03-16 13:15:59
虚拟基类的构造函数总是从大多数派生类中调用,使用它可能传入的任何参数。在你的情况下,大多数派生类没有指定初始化器A
,因此使用默认构造函数。
发布于 2018-03-16 14:14:37
在virtual
继承的情况下,它是调用虚拟基类的构造函数的派生类。所以,如果你想要A
一个整数被调用的构造函数,你需要将它添加到C
初始化列表中。
C(int i) : A(i), B(i) {cout<<"in C const\n";}
对于问题的第二部分,缺省构造函数不是必需的,但派生类必须显式调用非缺省构造函数,因为编译器无法在没有非缺省构造函数的情况下为您执行此操作。
#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;
}
输出:
In A const
in B const
in C const
In A const
in B const
in C def cstr
https://stackoverflow.com/questions/-100003631
复制相似问题