草庐IT

C++:虚拟继承

全部标签

c++ - 这是非多态继承的一个很好的理由吗?

std::string(因为大多数——如果不是全部——标准类)没有任何虚拟方法,所以创建一个带有虚拟方法的继承类将导致UB(很可能是由于析构函数)。(如果我错了请纠正我)。我认为没有多态性的继承是可以的,直到我在网上看到这个主题。例如,在这个答案中:Whyshouldonenotderivefromc++stdstringclass?一些论点反对这种做法。主要原因似乎是切片问题,当将派生对象传递给函数而不是std::string时,它会抑制添加的功能。参数,从而使非多态性不合逻辑。如果想要扩展string的功能,惯用的C++方法是创建自由函数。.我同意所有这些,特别是因为我提倡自由函数

c++ - 在 C++ 中定义虚拟 get 和 set 函数被认为是一种好的做法吗?

如果我有一个简单的2级类层次结构,例如这个://level1classSpare_Part{private:stringname;doubleprice;public:Spare_Part();stringgetName(){returnname;}doublegetPrice(){returnprice;}virtualintgetQuantity(){return-1;};//mayalsodefineitaspurevirtual};//level2classOn_hand:publicSpare_Part{private:intquantity;stringlocation;p

c++ - 继承时删除重复的模板类型名条目

我有一个继承自的模板类(从现在开始作为父类引用)。模板类初始化一个fusion列表成员变量,其中包含子类中指定的类和构造函数。templateusingList=boost::fusion::list;templateclassElementContainer{protected:constListchildren;public:ElementContainer(CHILDREN_TYPES&&...args):children(forward(args)...){}};子类示例:classXMLSignatureDocument:publicElementContainer{publ

c++ - 使用继承来添加功能

我正在使用抽象基类将日志记录功能添加到我的所有类中。它看起来像这样:classAbstractLog{public:virtual~AbstractLog()=0;protected:voidLogException(conststd::string&);private:SingletonLog*m_log;//definedelsewhere-isasingletonobject};LogException()方法将文本写入SingletonLog对象中定义的日志文件,然后抛出异常。然后我将其用作所有后续类的基类(在数百个库/DLL中可能有数百/数千个)。这允许我在通常会抛出异常的地

c++ - 继承构造函数仅部分起作用

我有下面的类(class),写成这样,无论typedef是什么,它都能完全工作:classA{protected:typedefucharmDataType;std::vectormData;uint32mWidth;uint32mHeight;friendclassC;public:A();A(void*data,uint32width,uint32height,size_tdataSize);A(constA&other);A(A&&other);A&operator=(constA&other);A&operator=(A&&other)=delete;~A();}我想创建一个子

c++ - 虚拟调度后调用基础成员(模拟类似虚拟析构函数的调度)

虚拟调度只是选择“正确”的东西在层次结构中调用。我想实现类似于析构函数行为的功能,其中首先调用派生析构函数,然后调用层次结构中的所有析构函数,直到最上层。客户端应该只定义成员函数,调用顺序应该自动解析。我有一个使用CRTP且没有虚拟调用的解决方案草案;它有其优点和缺点:#include#includeusingnamespacestd;templatestructDispatcher{voidf(){((T*)this)->f();std::cout{voidf(){std::cout>obj=make_shared();obj->f();}Demo这样用户就可以简单地从调度器派生并定

c++ - 纯虚拟 friend 类

我有课A有一个指向纯虚类实例的指针B.类C源自B并且会自动有一个指向A的指针(它是它的父级),并且需要访问它的成员。这可以通过添加friendclassC来实现内部类A,虽然这对于将从B派生的每个类都是必需的.代码示例:classA{public:friendclassB;//ThisdoesnotallowderivedclassestobefriendsfriendclassC;//NowderivedclassBhasaccessto`DoDomething`,butthenthisisneededforeverysinglederivedclassprivate:voidDoD

c++ - C++11 中的可变参数模板和多重继承

我正在努力实现这样的目标:我有一个模板化的基类,我想动态继承它templateclassfooBase{public:fooBase(){};~fooBase(){};};期望的方法:(像这样,不太确定该怎么做)templateclassfoo:publicInterfaces...{public:foo();~foo();}我的目标是让foo类像这样:第二种方法:classfoo():publicfooBase,publicfooBase,publicfooBase//andthelistcouldgoon{foo();~foo();}使用第二种方法的问题是,如果我实例化一个foo对

c++ - 两个不同的继承指针地址如何相等?

看完C++:Comparingpointersofbaseandderivedclasses,我认为这肯定行不通。当我执行这个时,c_as_b和&c的打印地址不同,那么为什么这个打印“似乎可以安全地比较同一层次结构中的指针”?除了可能导致true的打印地址之外,还比较了什么?您能否举一个类似的小例子,其中==结果为false?#includeusingnamespacestd;structA{std::strings;};structB{inti;};structC:A,B{doubled;};intmain(){Cc;B*c_as_b=&c;A*c_as_a=&c;cout示例输出:

基类和继承类之间的C++函数重载

考虑下面的例子。我猜想因为func是虚拟的,所以调用哪个实现的决定将在运行时根据实例类型(类型B)和参数类型(short或int)完成然而,在运行这段代码后,我得到了意想不到的结果,指针类型只决定了跳转哪个函数,这完全打破了我对多态性的基本假设...这引出了一个问题,我在哪里可以将2func实现与函数重载联系起来?谁能告诉我是什么原因导致了这个结果?谢谢classA{public:virtualvoidfunc(shortx){printf("A::func%d\n",x);}};classB:publicA{public:virtualvoidfunc(intx){printf("B