错误的构造函数调用了虚拟基 class 的虚拟基 class
wrong constructor called for virtual base class of virtual base class
我遇到了一个非常复杂的 class 结构的构造函数问题,该结构分布在多个文件中。每个 class 都有一个 public 没有参数的默认构造函数和一个有参数的受保护构造函数。任何派生 class 的每个构造函数都使用参数调用其 parent 的受保护构造函数。以下示例对于结构中的所有派生 classes 都是相同的(parent classes 的数量可能不同)。
文件example.h:
class SomeDerivedClass : virtual public SomeParentClass, virtual public SomeOtherParentClass {
public:
SomeDerivedClass();
protected:
SomeDerivedClass(int value);
}
文件example.cpp:
SomeDerivedClass::SomeDerivedClass() : SomeParentClass(0), SomeOtherParentClass(0) {
printf("SomeDerivedClass\n");
}
SomeDerivedClass::SomeDerivedClass(int value) : SomeParentClass(value), SomeOtherParentClass(value) {
printf("SomeDerivedClass(%d)\n", value);
}
当我构造一个 class 时,所有直接虚拟 parent 都是使用具有参数的受保护构造函数构造的。但是即使 parents 的受保护构造函数也应该调用它自己的虚拟 parents 的受保护构造函数,grandparents 总是使用默认构造函数构造的。
最小示例:
#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()
答案在 Sam Varshavchik 的评论中给出。
将参数从每个构造函数传递给它的直接父级的概念是处理问题的错误方法。
我的印象是错误的,我只能访问每个 class 的直接父级。 Sam Varshavchik 的评论帮助我看到了真正的问题并在正确的地方寻找它。在众多 classes 之一中,有一个非虚拟继承使得无法访问基 class.
的构造函数
我遇到了一个非常复杂的 class 结构的构造函数问题,该结构分布在多个文件中。每个 class 都有一个 public 没有参数的默认构造函数和一个有参数的受保护构造函数。任何派生 class 的每个构造函数都使用参数调用其 parent 的受保护构造函数。以下示例对于结构中的所有派生 classes 都是相同的(parent classes 的数量可能不同)。
文件example.h:
class SomeDerivedClass : virtual public SomeParentClass, virtual public SomeOtherParentClass {
public:
SomeDerivedClass();
protected:
SomeDerivedClass(int value);
}
文件example.cpp:
SomeDerivedClass::SomeDerivedClass() : SomeParentClass(0), SomeOtherParentClass(0) {
printf("SomeDerivedClass\n");
}
SomeDerivedClass::SomeDerivedClass(int value) : SomeParentClass(value), SomeOtherParentClass(value) {
printf("SomeDerivedClass(%d)\n", value);
}
当我构造一个 class 时,所有直接虚拟 parent 都是使用具有参数的受保护构造函数构造的。但是即使 parents 的受保护构造函数也应该调用它自己的虚拟 parents 的受保护构造函数,grandparents 总是使用默认构造函数构造的。
最小示例:
#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()
答案在 Sam Varshavchik 的评论中给出。
将参数从每个构造函数传递给它的直接父级的概念是处理问题的错误方法。
我的印象是错误的,我只能访问每个 class 的直接父级。 Sam Varshavchik 的评论帮助我看到了真正的问题并在正确的地方寻找它。在众多 classes 之一中,有一个非虚拟继承使得无法访问基 class.
的构造函数