草庐IT

c++ - 关于 C++ 中的多重继承、虚拟基类和对象大小的问题

以下代码打印20,即sizeof(z)为20。#includeclassBase{public:inta;};classX:virtualpublicBase{public:intx;};classY:virtualpublicBase{public:inty;};classZ:publicX,publicY{};intmain(){Zz;cout而如果我在这里不使用虚拟基类,即对于以下代码:sizeof(z)是16。#includeclassBase{public:inta;};classX:publicBase{public:intx;};classY:publicBase{pub

c++ - 在复杂的多重继承层次结构中, "virtual"关键字在哪里?

我了解C++虚拟继承的基础知识。但是,我对究竟需要在何处使用具有复杂类层次结构的virtual关键字感到困惑。例如,假设我有以下类:A/\BC/\/\DEF\/\/GH\/I如果我想确保没有一个类在任何子类中出现多次,哪些基类需要标记为virtual?他们全部?或者仅在那些直接从可能具有多个实例的类(即B、C、D、E和F;以及G和H)派生的类上使用它就足够了(但仅限于基类E,而不是与基类D和F))? 最佳答案 我一起玩弄了一个程序,它可以帮助您研究虚拟基地的复杂性。它将I下的类层次结构打印为适合graphiviz(http://ww

c++ - 在复杂的多重继承层次结构中, "virtual"关键字在哪里?

我了解C++虚拟继承的基础知识。但是,我对究竟需要在何处使用具有复杂类层次结构的virtual关键字感到困惑。例如,假设我有以下类:A/\BC/\/\DEF\/\/GH\/I如果我想确保没有一个类在任何子类中出现多次,哪些基类需要标记为virtual?他们全部?或者仅在那些直接从可能具有多个实例的类(即B、C、D、E和F;以及G和H)派生的类上使用它就足够了(但仅限于基类E,而不是与基类D和F))? 最佳答案 我一起玩弄了一个程序,它可以帮助您研究虚拟基地的复杂性。它将I下的类层次结构打印为适合graphiviz(http://ww

C++多重继承防止钻石

有没有办法在C++中定义一个类Foo这样我可以继承它我不能从中“继承钻石”即classCat:publicFoo{}//okayclassDog:publicFoo{}//okayclassWeird:publicCat,publicDog{}//Iwantthistothrowacompilererror 最佳答案 Cprogramming.com教程:用...解决C++中的菱形继承(钻石问题)http://www.cprogramming.com/tutorial/virtual_inheritance.html试试这个对于此类

C++多重继承防止钻石

有没有办法在C++中定义一个类Foo这样我可以继承它我不能从中“继承钻石”即classCat:publicFoo{}//okayclassDog:publicFoo{}//okayclassWeird:publicCat,publicDog{}//Iwantthistothrowacompilererror 最佳答案 Cprogramming.com教程:用...解决C++中的菱形继承(钻石问题)http://www.cprogramming.com/tutorial/virtual_inheritance.html试试这个对于此类

c++ - 多重继承和纯虚函数

以下代码:structinterface_base{virtualvoidfoo()=0;};structinterface:publicinterface_base{virtualvoidbar()=0;};structimplementation_base:publicinterface_base{voidfoo();};structimplementation:publicimplementation_base,publicinterface{voidbar();};intmain(){implementationx;}编译失败,出现以下错误:test.cpp:Infunctio

c++ - 多重继承和纯虚函数

以下代码:structinterface_base{virtualvoidfoo()=0;};structinterface:publicinterface_base{virtualvoidbar()=0;};structimplementation_base:publicinterface_base{voidfoo();};structimplementation:publicimplementation_base,publicinterface{voidbar();};intmain(){implementationx;}编译失败,出现以下错误:test.cpp:Infunctio

c++ - 多重继承+虚函数困惑

我有一个像这样的菱形多重继承场景:A/\BC\/D共同的父节点A定义了一个虚函数fn()。B和C都可以定义fn()吗?如果是,那么下一个问题是-D可以无歧义地访问B和C的fn()吗?我假设这有一些语法..D是否有可能在不明确知道B和C是谁的情况下这样做?B和C可以被其他一些类替换,我希望D中的代码是通用的。我想要做的是让D以某种方式枚举它在其祖先中拥有的所有fn()实例。这是否可能以其他方式表示虚函数? 最佳答案 除非您在D中再次覆盖fn,否则这是不可能的。因为在D对象中没有最终覆盖器:C和B都覆盖了A::fn。您有多种选择:删除C

c++ - 多重继承+虚函数困惑

我有一个像这样的菱形多重继承场景:A/\BC\/D共同的父节点A定义了一个虚函数fn()。B和C都可以定义fn()吗?如果是,那么下一个问题是-D可以无歧义地访问B和C的fn()吗?我假设这有一些语法..D是否有可能在不明确知道B和C是谁的情况下这样做?B和C可以被其他一些类替换,我希望D中的代码是通用的。我想要做的是让D以某种方式枚举它在其祖先中拥有的所有fn()实例。这是否可能以其他方式表示虚函数? 最佳答案 除非您在D中再次覆盖fn,否则这是不可能的。因为在D对象中没有最终覆盖器:C和B都覆盖了A::fn。您有多种选择:删除C

c++ - 虚拟析构函数和删除具有多重继承的对象......它是如何工作的?

首先,我理解为什么在单继承和通过基指针删除对象方面需要virtual析构函数。这特别是关于多重继承以及为什么这有效的原因。这个问题出现在我的一堂大学类(class)中,没有人(包括教授)知道为什么会这样:#includestructA{virtual~A(){std::cout这个的输出是:~AB~B~A~AB~B~A编译器如何知道在删除a或bA和B的析构函数?具体来说,AB的内存是如何布局的(特别是它的虚函数表),以便可以调用A和B析构函数?我的教授建议将内存布局(某种东西)如下:AB+---------++----+|AVFT|------>|~A|+---------++----