virtual-inheritance相关内容

C++ 多重虚拟继承与 COM

网络上充斥着对“可怕的钻石问题"的解释.StackOverflow 也是如此.我想我理解这一点,但我无法将这些知识转化为理解相似但不同的东西. 我的问题从纯 C++ 问题开始,但答案很可能会扩展到 MS-COM 细节.一般问题的问题是: class Base {/* 纯虚拟的东西 */};class Der1 : Base/* 非虚拟!*/{/* 纯虚拟的东西 */};class Der2 ..
发布时间:2022-01-14 12:19:29 C/C++开发

C++ 不能通过虚基 A 从基 A 转换为派生类型 B

我有三个班级: class A {};B 类:虚拟公共 A {};C 类:虚拟公共 A {};D类:公共B,公共C{}; 尝试从 A* 静态转换到 B* 我收到以下错误: 不能通过虚基A从基A转换为派生类型B 解决方案 为了理解强制转换系统,您需要深入研究对象模型. 简单层次模型的经典表示是包含:如果 B 派生自 A 那么 B 对象实际上将包含一个 A 子对象以及它自己的属性. ..
发布时间:2021-12-31 21:53:49 C/C++开发

C++虚继承

问题: class Base {上市:基地(基地* pParent);/* 实现基本的东西 */};A类:虚拟公共基础{上市:A(A* pParent) : Base(pParent) {}/* ... */};B类:虚拟公共基础{上市:B(B* pParent) : Base(pParent) {}/* ... */};C类:公共A,公共B{上市:C(C* pParent) : A(pPare ..
发布时间:2021-12-18 22:26:58 C/C++开发

为什么虚拟基类必须由最派生的类构造?

以下代码无法编译: class A {上市:A(int) {}};B类:虚拟公共A{上市:B(): A(0) {}};//最派生类C类:公共B{上市:C() {}//错误!!!}; 如果我在C的构造函数初始化列表中调用A的构造函数,即: //最派生类C类:公共B{上市:C(): A(0) {}//好的!!!}; 确实有效. 显然,这是因为虚拟基类必须始终由大多数派生类构建. 我 ..
发布时间:2021-12-17 19:36:39 C/C++开发

为什么在虚拟继承中调用默认构造函数?

我不明白为什么在下面的代码中,当我实例化 daughter 类型的对象时,会调用默认的 grandmother() 构造函数? 我认为应该调用 grandmother(int) 构造函数(遵循我的 mother 类构造函数的规范),或者这段代码不应该在都是因为虚拟继承. 这里编译器在我的背后默默地调用了grandmother默认构造函数,而我从来没有要求它. #include 班奶奶 ..
发布时间:2021-12-17 19:01:30 C/C++开发

在 C++ 中,什么是虚拟基类?

我想知道“虚拟基类"是什么以及它的含义. 让我举个例子: class Foo{民众:void DoSomething() {/* ... */}};类 Bar : 公共虚拟 Foo{民众:void DoSpecific() {/* ... */}}; 解决方案 在虚拟继承中使用的虚拟基类是一种在使用多重继承时防止给定类的多个“实例"出现在继承层次结构中的方法. 考虑以下场景: ..
发布时间:2021-12-01 15:09:42 C/C++开发

C++ 抽象基类构造函数/析构函数 - 一般正确性

我想要一个 C++ Interface,它在继承时必须被覆盖(如果可能的话).到目前为止,我有以下内容: class ICommand{民众://虚拟构造函数.需要取名字作为参数//虚拟ICommand(char*) =0;//虚拟析构函数,通过强制清理派生类来防止内存泄漏?//虚拟 ~ICommand() =0;虚空 CallMe() =0;虚拟无效 CallMe2() =0;};类 MyCo ..
发布时间:2021-11-26 17:13:29 C/C++开发

等效于 C++ 中的 Java 接口?

可能的重复: 如何在 C++ 中声明接口? c++中的java接口? 我是一名学习 C++ 的 Java 程序员,我想知道 C++ 中是否有类似 Java 接口的东西,即另一个类可以实现/扩展多个的类.谢谢.附言新来的,如果我做错了什么,请告诉我. 解决方案 在 C++ 中,一个只包含纯虚方法的类表示一个接口. 示例: //定义Serializable接口.类可序列化{/ ..
发布时间:2021-11-26 17:12:52 Java开发

C++ 抽象基类构造函数/析构函数 - 一般正确性

我想要一个 C++ Interface,它在继承时必须被覆盖(如果可能的话).到目前为止,我有以下内容: class ICommand{民众://虚拟构造函数.需要取名字作为参数//虚拟ICommand(char*) =0;//虚拟析构函数,通过强制清理派生类来防止内存泄漏?//虚拟 ~ICommand() =0;虚空 CallMe() =0;虚拟无效 CallMe2() =0;};类 MyCo ..
发布时间:2021-11-25 09:44:34 C/C++开发

等效于 C++ 中的 Java 接口?

可能的重复: 如何在 C++ 中声明接口? c++中的java接口? 我是一名学习 C++ 的 Java 程序员,我想知道 C++ 中是否有类似 Java 接口的东西,即另一个类可以实现/扩展多个的类.谢谢.附言新来的,如果我做错了什么,请告诉我. 解决方案 在 C++ 中,一个只包含纯虚方法的类表示一个接口. 示例: //定义Serializable接口.类可序列化{/ ..
发布时间:2021-11-25 09:43:47 Java开发

虚拟继承是否强制基类默认可构造?

在以下代码中,编译器要求基础类 X默认可构造.但是,如果我从 类 Node 的继承中删除 virtual 关键字,对成员 m_x 的访问当然变得不明确,但不再需要类 X 的默认构造函数. 这是什么原因? #include 结构体应用{模板struct Node : virtual T//这一行包含虚拟继承{模板节点(参数...参数):T(参数...){}};模板结构继承;模板结构继承继承( ..

为什么派生类的构造函数要在C ++中初始化虚拟基类?

我的理解,例如阅读这,是派生类的构造函数不会调用其虚拟基类的构造函数. 这是我做的一个简单示例: A类{受保护的:A(int foo){}};B类:公共虚拟A {受保护的:B(){}};C类:公共虚拟A {受保护的:C() {}};D类:公共B,公共C {上市:D(int foo,int bar):A(foo){}};int main(){返回0;} 出于某种原因,构造函数 B :: ..
发布时间:2021-04-24 19:23:55 C/C++开发

“中产阶级"指的是“中产阶级".在使用非默认虚拟基础构造函数的Diamond继承图中:为什么它不是编译错误?

考虑菱形继承图(即虚拟基类).我们从上一个知道 的主体是被执行的. 那是为什么?我本以为应该是编译错误.(当然,当声明了最派生的类并创建了菱形时,就将其检测出来.) 我正在寻找两件事: 此标准在哪里指定? 这种显式但尚未被忽略的代码会在语言的其他地方发生吗? 我正在谈论的代码示例遵循其实际和预期的输出,如下所示: B 0arg-ctorMf 0arg-ctorMt 0 ..

使用Apple的LLVM编译器-O而不是g ++ -7.2.0编译-O时,C ++代码段出错

更新:我创建了一个甚至更多的M,但仍然是CVE,可以重现崩溃.摘要:删除了对 Base 类中的 Bool * bools _ 字段的所有使用(但仍必须定义它,否则不会发生崩溃).还从 Base 及其子代中删除了 Base :: Initialize()和虚拟方法 Rule .附加了新的MCVE. 我已经设法为此代码创建了一个MCVE并将其发布在下面. 一些描述性的细节:代码使用虚拟基类 ..
发布时间:2021-04-22 18:40:43 C/C++开发

使用具有虚拟多重继承的基本构造函数

运行下面的代码,我希望获得以下控制台输出: B int v D 相反,E的构造函数正在调用B的默认构造函数,结果是: B D 实现正确构造的一种方法是在E中重新声明D的相同构造函数(即,注释的代码部分),但我仍然希望有一个更好的解决方案. 准备运行代码,带有-std = c ++ 11标志: #includeA类{上市:虚拟虚空f ..
发布时间:2021-04-20 18:54:13 C/C++开发