草庐IT

多重背包

全部标签

c++ - 当您使用多重继承时,静态转换何时安全?

我发现自己处于一种我知道某物是什么类型的情况。类型是三个(或更多)继承级别之一。我调用返回B*的工厂,但是T是类型的最高级别(如果我的代码知道它是什么)或第二级别。无论如何,我在模板中做了一个static_cast,这是错误的做法。我的问题是我什么时候可以安全地进行静态转换?有没有这样的时候?我在这种情况下这样做是因为当我不小心将T作为古怪的东西(已经发生并且)动态转换忽略(并返回null)时,我宁愿得到编译错误。但是,当我知道正确的类型时,指针没有调整,导致我的指针不好。我不知道为什么在这种情况下允许静态转换。什么时候可以安全地使用static_cast进行向下转换?有没有什么情况?

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++ - 关于 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