c++ - 为虚拟基类的虚拟基类调用了错误的构造函数
问题描述
我对分布在多个文件中的非常复杂的类结构的构造函数有疑问。每个类都有一个不带参数的公共默认构造器和一个带参数的受保护构造器。任何派生类的每个构造函数都使用参数调用其父类的受保护构造函数。以下示例对于结构中的所有派生类都是相同的(父类的数量可能不同)。
文件示例.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()
解决方案
Sam Varshavchik 在评论中给出了答案。
将参数从每个构造函数传递给它的直接父级的概念是处理问题的错误方法。
我有错误的印象,我只能访问每个班级的直接父母。Sam Varshavchik 的评论帮助我看到了真正的问题并在正确的地方寻找它。在众多类之一中,有一个非虚拟继承使得无法访问基类的构造函数。
推荐阅读
- javascript - 如何在另一个函数的参数中传递一个函数的局部值(无事件)?
- visual-studio-code - 有没有办法只折叠 VS Code 资源管理器中的文件?
- reactjs - 在 React 中的按钮的 onClick 中立即手动显示 Loading/Spinner(无需等待 setter)
- docker - 如何在 macvlan Docker 网络上启用 Nginx 代理管理器以成功重定向到主机上的 Synology DSM?
- html - 统计预览前端
- node.js - Prisma.js:我们发现无法执行的更改
- php - PHP 正在压缩发送给您网站访问者的数据?问题出在哪里?
- javascript - API in NextJS that serves a JSON file, can I edit this file (after build, while running) and make the API serve the updated file?
- powerbi - powerBi 前一周和本周总销售额的比较
- tableau-api - 我在 tableau(公共桌面)中创建了一个计算字段,没有显示错误,CALCULATION IS VALID。但是当点击“接受”时没有任何反应,为什么?