<分区>
我认为一个例子可以最好地描述我的问题。
struct Base {
Base() = delete;
Base(int x) : x(x) {}
int x;
};
struct Derived1 : virtual Base {
Derived1(int y) : Base(5), y(y) {}
int y;
};
struct Derived2 : virtual Base {
Derived2(int z) : Base(10), z(z) {}
int z;
};
struct Derived3: Derived1, Derived2 {
public:
Derived3(int y, int z) : Derived1(y), Derived2(z) {}
};
我得到一个错误:
在构造函数“Derived3::Derived3(int, int)”中:
错误:使用已删除的函数“Base::Base()”
Derived3(int y, int z) : Derived1(y), Derived2(z) {}
我不明白为什么会出现这个错误。在我看来,在这个例子中,所有基类实际上都是通过它们的构造函数初始化的(显式 Derived1
和 Derived2
以及通过 Derived2 隐式地
(我在这里不确定,也许通过 Base
Derived1
))。
好吧,让我们按照编译器告诉我的去做。
struct Derived3: Derived1, Derived2 {
public:
Derived3(int y, int z) : Base(-1), Derived1(y), Derived2(z) {}
};
它会编译,如果我现在这样做:
Derived3 d = Derived3(7, 9);
std::cout << d.x << std::endl;
std::cout << d.y << std::endl;
std::cout << d.z << std::endl;
我得到 -1, 7, 9
。这根本不是我想要的。一个想法是用它的一个派生类来初始化基类,我期望第一个数字是 5 或 10。
所以,这是我的问题:
为什么我在派生类之一中已经完成时被迫显式调用 Base
构造函数?
更具体地说,由于我有多重继承和虚拟继承,我相信 Derived3
的任何实例都恰好有一个 Base
类实例的拷贝。我期待 Base
的这个拷贝在它的最派生类(Derived1
或 Derived2
)中初始化,但我清楚地可以看到它不能以这种方式工作=(我哪里错了?