从多重继承
Inheritance from multiple inheritance
本文关键字:多重继承 更新时间:2023-10-16
多重继承有问题。我已经解决了钻石问题:
class A
{
int m;
int n;
public:
A(int x, int y)
{
m = x; n = y
}
fA() {}
};
class B : virtual public A // B has fA(),fB()
{
public:
B(int k) : A(1, k) {}
fB() {}
};
class C : virtual public A // C has fA(),fC()
{
public:
C(int k) : C(2, k) {}
fC() {}
};
class D : public B, public C // D has fA(),fB(),fC()
{
public:
D(int k) : B(k),C(k),A(3,k)
};
这运作良好。这个问题:
class S : public B // S has fA(),fB()
{
public:
S() : B(6) {}
};
编译器向我显示:"错误:调用'A::A()'没有匹配函数"
这段代码可以工作,但它不让我满意:
class S : public B // S has fA(),fB()
{
public:
S() : B(6),A(1,6) {}
};
在虚拟继承中,虚拟基的构造函数是从大多数派生类的构造函数调用的:
class S : public B // S has fA(),fB()
{
public:
S() : B(6) {}
}; // ^ A base class is initialized at this point, before B
这也意味着继承链下游初始化列表中对A
构造函数的其他显式调用将被忽略:
class B : virtual public A // B has fA(),fB()
{
public:
B(int k) : A(1, k) {}
fB() {} // ^^^^^^^ this call is ignored when B is a part of S object
};
如果在大多数派生类的初始化列表中没有显式调用虚拟基的构造函数,编译器将(当然)尝试调用默认构造函数。但是A
没有,那是你的问题。
您自己已经发现了一个解决方案。另一种是为A
编写默认构造函数。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 从多重继承中的派生类函数调用适当的父类函数
- C++具有多重继承的构造函数重载解析