草庐IT

c++ - .cpp 文件中的虚拟 C++ 方法实现是否应该标记为虚拟?

我有一个在.h文件中定义并在.cc文件中实现的虚拟C++方法。应该将.cc文件中的实现标记为虚拟,还是仅标记.h文件中的声明?例如,我的标题有:virtualstd::stringtoString()const;方法在我的.cc中实现:std::stringMyObject::toString()const{[implementationcode]}应该将实现标记为虚拟,还是上面的代码可以?有关系吗? 最佳答案 C++标准n3337§7.1.2/5说:Thevirtualspecifiershallbeusedonlyinthein

c++ - .cpp 文件中的虚拟 C++ 方法实现是否应该标记为虚拟?

我有一个在.h文件中定义并在.cc文件中实现的虚拟C++方法。应该将.cc文件中的实现标记为虚拟,还是仅标记.h文件中的声明?例如,我的标题有:virtualstd::stringtoString()const;方法在我的.cc中实现:std::stringMyObject::toString()const{[implementationcode]}应该将实现标记为虚拟,还是上面的代码可以?有关系吗? 最佳答案 C++标准n3337§7.1.2/5说:Thevirtualspecifiershallbeusedonlyinthein

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++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

我目前正致力于在非RTTI平台(Android)上集成使用大量RTTI内容的第三方包。基本上,我自己实现了RTTI,但遇到了一个问题。问题是很多类都有菱形继承问题,因为所有类都派生自同一个基类(对象)。所以,如果我想从基类向下转换为派生类,我必须使用dynamic_cast-但RTTI不可用!没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?看起来是这样的:classA{public:virtualchar*func(){return"A";};};classB:publicvirtualA{public://virtualchar*func(){return"

C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

我目前正致力于在非RTTI平台(Android)上集成使用大量RTTI内容的第三方包。基本上,我自己实现了RTTI,但遇到了一个问题。问题是很多类都有菱形继承问题,因为所有类都派生自同一个基类(对象)。所以,如果我想从基类向下转换为派生类,我必须使用dynamic_cast-但RTTI不可用!没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?看起来是这样的:classA{public:virtualchar*func(){return"A";};};classB:publicvirtualA{public://virtualchar*func(){return"

c++ - C++虚函数除了vtable怎么实现?

这个问题在这里已经有了答案:关闭11年前.PossibleDuplicate:AquestionaboutvirtualmechanisminC++在C++中使用vtable是实现虚成员函数机制的唯一方法吗?还有哪些其他方式? 最佳答案 从技术上讲,动态分派(dispatch)所需要的只是能够识别对象的动态类型,给定一个指向它的指针。因此,任何类型的隐藏(或不那么隐藏)typeid字段都可以工作。动态调度将使用该typeid来查找关联的函数。该关联可以是一个hastable或一个typeid为索引的数组,或任何其他合适的关系。vpt

c++ - C++虚函数除了vtable怎么实现?

这个问题在这里已经有了答案:关闭11年前.PossibleDuplicate:AquestionaboutvirtualmechanisminC++在C++中使用vtable是实现虚成员函数机制的唯一方法吗?还有哪些其他方式? 最佳答案 从技术上讲,动态分派(dispatch)所需要的只是能够识别对象的动态类型,给定一个指向它的指针。因此,任何类型的隐藏(或不那么隐藏)typeid字段都可以工作。动态调度将使用该typeid来查找关联的函数。该关联可以是一个hastable或一个typeid为索引的数组,或任何其他合适的关系。vpt

c++ - Diamond-inheritance 场景在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误

我有一个基类“Base”,它是一个纯虚类:classBase{public:virtualvoidA()=0;virtualvoidB()=0;virtual~Base(){}//Eclipsecomplainsthataclasswithvirtualmembersmusthavevirtualdestructor};我还有2个其他类,其中一个实现A(),另一个实现B():classDerivedA:publicvirtualBase{public:virtualvoidA(){printf("HellofromA");}};classDerivedB:publicvirtualBa

c++ - Diamond-inheritance 场景在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误

我有一个基类“Base”,它是一个纯虚类:classBase{public:virtualvoidA()=0;virtualvoidB()=0;virtual~Base(){}//Eclipsecomplainsthataclasswithvirtualmembersmusthavevirtualdestructor};我还有2个其他类,其中一个实现A(),另一个实现B():classDerivedA:publicvirtualBase{public:virtualvoidA(){printf("HellofromA");}};classDerivedB:publicvirtualBa