首页 > 解决方案 > 为虚拟基类的虚拟基类调用了错误的构造函数

问题描述

我对分布在多个文件中的非常复杂的类结构的构造函数有疑问。每个类都有一个不带参数的公共默认构造器和一个带参数的受保护构造器。任何派生类的每个构造函数都使用参数调用其父类的受保护构造函数。以下示例对于结构中的所有派生类都是相同的(父类的数量可能不同)。

文件示例.h:

class SomeDerivedClass : virtual public SomeParentClass, virtual public SomeOtherParentClass {
public:
    SomeDerivedClass();
protected:
    SomeDerivedClass(int value);
}

文件示例.cpp:

SomeDerivedClass::SomeDerivedClass() : SomeParentClass(0), SomeOtherParentClass(0) {
    printf("SomeDerivedClass\n");
}
SomeDerivedClass::SomeDerivedClass(int value) : SomeParentClass(value), SomeOtherParentClass(value) {
    printf("SomeDerivedClass(%d)\n", value);
}

当我构造一个类时,所有的直接虚拟父对象都是用带参数的受保护构造函数构造的。但是即使父母的受保护构造函数也应该调用它自己的虚拟父母的受保护构造函数,祖父母总是使用默认构造函数构造。

最小的例子:

#include <stdio.h>

class Base {
public:
  Base() { printf("Base()\n"); }
  ~Base() {}
protected:
  Base(int value) { printf("Base(%d)\n", value); }
};

class Derived1 : virtual public Base {
public:
  Derived1() : Base(0) { printf("Derived1()\n"); }
  ~Derived1() {}
protected:
  Derived1(int value) : Base(value) { printf("Derived1(%d)\n", value); }
};

class Derived2 : virtual public Derived1 {
public:
  Derived2() : Derived1(0) { printf("Derived2()\n"); }
  ~Derived2() {}
protected:
  Derived2(int value) : Derived1(value) { printf("Derived2(%d)\n", value); }
};

int main() {
  Derived2* NewDerived2 = new Derived2();
}

结果:

Base()
Derived1(0)
Derived2()

标签: c++c++11inheritancemultiple-inheritancevirtual-inheritance

解决方案


Sam Varshavchik 在评论中给出了答案。

将参数从每个构造函数传递给它的直接父级的概念是处理问题的错误方法。

我有错误的印象,我只能访问每个班级的直接父母。Sam Varshavchik 的评论帮助我看到了真正的问题并在正确的地方寻找它。在众多类之一中,有一个非虚拟继承使得无法访问基类的构造函数。


推荐阅读