C++ 多重继承构造函数调用
c++ multiple inheritence constructor calling
在下面的行中,类A是基类,由类B和C继承。D类继承自B和C。此外,D 中的构造函数调用 B、C 和 A 的构造函数。因为当 B 和 C 继承 A 作为虚拟时,他们没有资格直接调用 A 的构造函数(因为必须通过第 3 代调用相同的构造函数)。
我的问题是,如果我想创建一个类 B 的对象,那么由于 A 是虚拟继承的,是否无论如何都要调用 A 的构造函数(传递 v1 和 v2,用于初始化的变量)?
class A {
int a1,a2;
A() {
}
A(int v1,v2) {
a1 = v1;
a2 = v2;
}
};
class B:virtual public A {
int b1,b2;
B() {
}
B(int v1,v2) {
b1 = v1;
b2 = v2;
}
};
class C:virtual public A {
int c1,c2;
C() {
}
C(int v1,v2) {
c1 = v1;
c2 = v2;
}
};
class D:public B,public C {
int d1,d2;
D() {
}
D(int v1,v2):B(v1,v2),C(v1,v2),A(v1,v2)
{
d1 = v1;
d2 = v2;
}
};
也给
B
一个A
的初始值设定项是完全可以的。虚拟继承意味着,如果你有一个派生更多的对象,那么虚拟基础是由派生最多的对象构造的。但是,如果您只构造 B
的实例,则该实例是派生最多的对象。所以就这样写吧:
class B : public virtual A
{
public:
B() : A(1, 2) { }
// ...
};
仅当您从B
派生时,才会忽略基本初始值设定项。
你可以做的是让类 B 和 C 从 A 正常继承(没有关键字"虚拟"),但使类 D 从 B 和 C 中虚拟继承。这将允许您通过传递类 A 构造函数的值来创建类 B(或 C)的对象>
相关文章:
- 如何在 c++ 多重继承中调用父非虚函数?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- 从多重继承中的派生类函数调用适当的父类函数
- 指针到成员函数和多重继承
- 多重继承:调用所有覆盖的函数
- 多重继承析构函数调用他自己和父析构函数?c++
- 没有匹配的函数调用CTOR,多重继承
- 纯虚拟函数和多重继承
- 在C++中的多重继承中调用构造函数中的基成员
- 可变参数模板类中的多重继承和调用构造函数
- C++ 中具有虚函数的多重继承
- 多重继承中的构造函数调用序列
- 移动构造函数和多重继承
- C++ 多重继承构造函数调用
- 从多重继承中的双亲调用函数
- 具有相同名称的抽象和已定义继承函数的多重继承
- 用多重继承调用c++中被覆盖的函数
- 从未知的派生类调用接口函数(多重继承)
- 虚拟但不是多重继承来调用祖父构造函数
- 编译器对此指针、虚函数和多重继承的详细信息