1

我有三种类类型:Base->Center->Child,我想让从父类型构造子类型成为可能,所以我这样声明它们:

class Base {
public:
    Base(void) {cout << "Base()" << endl;}
    virtual ~Base(void) {}
    Base(const Base &ref) {cout << "Base(const Base &)" << endl;}
};
class Center : public virtual Base {
public:
    Center(void) : Base() {cout << "Center()" << endl;}
    Center(const Base &ref) : Base(ref) {cout << "Center(const Base &)" << endl;}
};
class Child : public virtual Center {
public:
    Child(void) : Center() {cout << "Child()" << endl;}
    Child(const Base &ref) : Center(ref) {cout << "Child(const Base &)" << endl;}
};

可以这样调用:(调用Center和Base的拷贝构造函数)

Base base;
Center center(base);

.
但是,这些代码的行为出乎意料:

Child child(base);

输出是:

Base()
Center(const Base &)
Child(const Base &)

为什么叫 Base(void) 而不是 Base(const Base &)?

解决了(非常感谢 Dietmar Kühl 和 Adam Burry)
两种方法:

1. add Base(const Base &) to Child, which would looks like this:
   Child(const Base &ref) : Base(ref), Center(ref) {}
2. or, remove virtual inheritance, which would looks like this:
   class Center : public Base {...}
   class Child : public Center {...}
4

1 回答 1

2

基类的参数virtual由最派生类提供,而不是由中间类提供。如果要将收到的参数传递ChildBase,则需要Child像这样实现构造函数:

Child::Child(Base const& other)
    : Base(other)
    , Center(other)
{
}

顺便说一句,在 C++ 中使用(void)而不是()表示该函数不接受任何参数是不常见的:在 Cvoid中,有时需要区分变量参数列表函数和不带参数的函数(我不知道在 C11 中是否仍然如此)。在 C++ 中,一对空括号始终表示一个空参数列表。

于 2013-09-14T02:48:31.763 回答