微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为虚拟基类的虚拟基类调用了错误的构造函数

如何解决为虚拟基类的虚拟基类调用了错误的构造函数

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

文件示例.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);
}

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

最小示例:

#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 的评论中给出。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。