草庐IT

virtual-inheritance

全部标签

c++ - 解决 C++ 中不明确的 this 指针

我正在尝试从旧类派生新类。基类声明如下所示:classDriver:publicPlugin,publicCmdObject{protected:Driver();public:staticDriver*GetInstance();virtualEngine&GetEngine();public://Pluginmethods...virtualboolInitPlugin(Mgr*pMgr);virtualboolOpen();virtualboolClose();//CmdObjectvirtualboolExecObjCmd(uint16cmdID,uint16nbParams,

c++ - "Inheriting"具有可变模板函数的类

我想编写一个可以操作不同类型数据库(例如sqlite、postgres等)的数据库包装器,因此无论用户实际使用什么数据库,他们编写的代码都不会改变。在我看来,这需要一个抽象基类,例如:classdatabase{public:virtualboolquery(conststd::string&q)=0;//Otherstuff};classsqlite:publicdatabase{public:boolquery(conststd::string&q){//Implementation}};这看起来不错,但我正在使用可变参数模板来转义查询中的参数(我真的很喜欢这个想法,所以我想坚持下

c++ - 为什么 virtual void test()=00 有效但 virtual void test()=+0 和 virtual void test()=-0 无效?

我搜索了一些关于虚函数声明的帖子,相信=0在virtualvoidtest()=0;是固定句法所以virtualvoidtest()=NULL;virtualvoidtest()=false;virtualvoidtest()=1-1;virtualvoidtest()=0.0;和其他声明应该是无效的。但是我发现了virtualvoidtest()=00;virtualvoidtest()=000;virtualvoidtest()=0000;还能编译,为什么?还有,我觉得整数+0和-0其实和0一样(不知道对不对),就像00其实就是0一样,为什么virtualvoidtest()=+0

c++ - 菱形多态继承 : sizeof Most derived Class

我知道菱形继承会导致歧义,可以通过virtualBaseClasses使用继承来避免,问题不在于此。当类是多态时,问题是关于菱形层次结构中最派生类的大小。这是示例代码和示例输出:#includeusingnamespacestd;classBase{public:virtualvoiddoSomething(){}};classDerived1:publicvirtualBase{public:virtualvoiddoSomething(){}};classDerived2:publicvirtualBase{public:virtualvoiddoSomething(){}};cl

c++ - 转发声明 : templates and inheritance

在编写框架时遇到以下问题:我有classA和classB派生自classA。classA有一个返回B*的函数。当然,这并不难:#includeusingnamespacestd;classB;//forwarddeclarationclassA{public:B*ReturnSomeData();};classB:publicA{};//Implementation:B*A::ReturnSomeData(){returnnewB;//doesn'tmatterhowthefunctionmakespointer}intmain(){Asth;cout但是我不得不使用像这里这样的模板:

c++ - 单一虚拟继承

我理解基类的虚拟继承在多个派生类之间创建了一个公共(public)共享基类,从而解决了DDD问题。如果我的基类只有一个派生类,那么虚拟继承基类或非虚拟继承基类时有区别吗?基本上我试图理解查询中提供的解释Isitpossibletoforbidderivingfromaclassatcompiletime?其中Usage_lock基类实际上是继承的,以防止从类Usable派生。如果我删除这个虚拟键,行为就会改变,即我能够从Usable派生子类。所以我想了解单继承场景中虚拟键造成的差异。 最佳答案 单个虚拟继承情况下的主要区别在于,只有

c++ - 调用姐妹类 C++ 的函数

考虑以下代码:#includeclassA{public:virtualvoidf()=0;virtualvoidg()=0;};classB:virtualpublicA{public:virtualvoidf(){g();}};classC:virtualpublicA{public:virtualvoidg(){std::coutf();}以下程序的输出是C::g。编译器如何调用B类的姊妹类的函数?? 最佳答案 N333710.3/9[Note:Theinterpretationofthecallofavirtualfunct

c++ - 多层继承中的virtual关键字

我有一个继承链,其中A类公开继承自B类,B类又公开继承自C类。C类的析构函数被标记为“虚拟”。是否有人反对将B类和A类的析构函数标记为虚拟的?或者在这些情况下是否需要支付性能/内存损失? 最佳答案 如果基类析构函数被标记为虚拟的,那么派生类析构函数也是隐式虚拟的,您不需要明确地将其指定为虚拟的。没有性能或内存损失所以在你的例子中,如果C有一个虚拟析构函数B并且A继承了析构函数的“虚拟性” 关于c++-多层继承中的virtual关键字,我们在StackOverflow上找到一个类似的问题:

c++ - C++ 中 `virtual` 关键字对对象而不是指针的行为

我试图理解虚函数。考虑以下代码,#include#include#includeclassAnimal{public:virtualvoideat(){std::cout使用virtual关键字我得到了输出Ieatlikeagenericanimal.Ieatlikeawolf!这是应该的。但是如果我删除virtual关键字,我仍然会得到相同的输出!从我的对虚函数的基本理解,没有virtual我应该得到输出Ieatlikeagenericanimal.Ieatlikeagenericanimal.这里有什么我遗漏的基本知识吗?我在Linux上使用g++编译器

c++ - 虚拟继承使应用程序崩溃

以下代码崩溃(访问冲突错误),因为我使用了虚拟继承。AFAIK虚拟继承通过强制使用类的单个实例来解决Diamond问题。在这种情况下,Derived类仅继承了IObject的一个实例,因此应该没有问题,但它崩溃了。classIObject{public:virtualintgetType()=0;};classBase:publicIObject{protected:intval;public:Base(){val=1;}virtualintgetType();};intBase::getType(){returnval;}classDerived:publicvirtualBase/