草庐IT

polymorphism

全部标签

c++ - 多态性:成员访问和getter给出不同的结果

代码如下:#include#include#includeclassParent{public:virtualvoidwhatAmI(){std::coutvalue=10;sc.parent->whatAmI();std::coutvaluegetValue()它返回:Achild10valuefromChild0我已经阅读了有关对象切片的内容,并确保在child被切片后我会分配值10。我仍然不明白为什么直接字段访问和函数调用会给出不同的结果。谢谢。 最佳答案 这里没有切片-您正在通过指针访问。该行为是由于成员变量访问是不是多态的

c++ - 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?

我想知道为什么这个程序不能编译(在msvc、gcc和clang上的行为相同):#includeusingnamespacestd;structAction{virtualvoidaction(){cout按照我的预期,删除的复制构造函数应该让其他ActionDecorator实例构造ActionDecorator,因为它是Action的多态类型。相反,我必须将ActionDecorator实例显式转换为Action&,因为编译器提示试图引用已删除的复制构造函数。是否有一些标准规则可以解释这种行为? 最佳答案 删除函数不会将其从重载决

C++、函数表和模板

我有一个函数表。它看起来像这样:structAnimalFunction{void(*Walk)(inta);void(*Sing)(inta,intb);void(*Dance)(inta,intb,intc);};usingAnimalFunctionTable=map;换句话说,我有几行AnimalFunction和一个从我知道的某个字符串到一个类型的映射。为简单起见,也许我包含一些额外的参数,以便它们都具有相同的签名并忽略它们不需要的内容:WalkDog(inta,int,int){...}.现在我必须定义像WalkDog()、SingDog()、DanceDog()和Walk

从基础到派生的 shared_ptr 的 C++ dynamic_ptr_cast 失败

这是我本周遇到的一个益智游戏。部分原因是我在编写了一段时间的Java代码后刚刚回到C++编码。给定以下代码:classBase{};classA:Base{public:virtualvoidrun(){coutptrToA=shared_ptr(newC());cout(ptrToA)run();assert(dynamic_pointer_cast(ptrToA));cout为什么会产生如下输出?PointertoA:0x1f29c010DynamicCastAptrtoC:0Running...ThisisC.tester-cpp:tester.cpp:89:intmain(in

c++ - 为什么如果我删除指向基类的指针我会发生内存泄漏?

我有base类和继承base类的类:classbase{};classderived:publicbase{std::stringstr;};我需要使用指向base类的指针来管理一个derived类,但是下面的代码会导致内存泄漏:base*ptr=newderived();deleteptr;我必须转换ptr,还是有更好的选择? 最佳答案 您需要在基类中有一个虚拟析构函数,以便在运行时找到并调用派生类的析构函数。参见thisquestionandanswer了解更多详情。 关于c++-为

C++:在不违反 SRP 的情况下向多态类层次结构添加方法?

我经常遇到一个设计问题。为了便于说明,我们假设我有一个多态类层次结构classA{public:virtual~A(){}...};classB:publicA{...};classC:publicB{...};classD:publicA{...};...我希望能够以多态方式打印这些类的实例,即每个类都有自己的打印方式。实现这一点的明显方法是添加virtualvoidprint(OutputStream&os)=0;进入基类并在每个子类中覆盖此方法。但是,如果类的原始职责与打印无关,这将给它们增加另一个职责,从而违反了SRP。.我的问题是:在不违反SRP的情况下实现所需行为的正确方法

c++ - 在基类中混合使用虚函数和非虚函数是否是一种糟糕的编程习惯?

我有一个基类Base,我声明了它的几个多态子类。一些基类的函数是纯虚函数,而另一些则由子类直接使用。(这都是C++)例如:classBase{protected:floatmy_float;public:virtualvoidFunction()=0;voidSetFloat(floatvalue){my_float=value}classsubclass:publicBase{voidFunction(){std::cout因此,如您所见,子类将依赖于设置“my_float”的函数的基类,但对于其他函数而言将是多态的。所以我想知道这是否是一种好的做法。如果您有一个抽象基类,您应该使它

C++ 多态接口(interface)

我正在尝试创建一种方法来处理许多不同版本的协议(protocol),类似于问题Howtohandledifferentprotocolversionstransparentlyinc++?.我同意继承链可以很好地解决这个问题。这就是我在Java中的做法:创建一个IParser接口(interface),并有几个ParserV0、ParserV1、...类,相互继承并实现IParser。我知道由于某些多重继承和虚拟技巧,在C++中创建该结构是可能的。关键在于:在Java中,如果我想要一个解析器,我想,我可以说IParserparser=getCorrectVersion(...)。我会得

c++ - 多态(继承)和值类型

我有一堆类型,PixelMeasure,PointMeasure,CentimeterMeasure依此类推,表示带有单位的值。我希望他们有值语义:例如有效不可变,不必担心内存分配,并且多态性:我可以返回类型为Measure的对象并且可以在不知道它是什么具体类型的情况下对其进行操作。我还希望能够放置多个不同的Measure放入容器中。似乎这些在C++中是互斥的。对于多态性,我需要使用指针或引用。我看到两个选项:使用智能指针,例如shared_ptr.这给了我想要的行为(安全,没有原始指针,但多态分派(dispatch))。缺点是:它很冗长(如果我真的想要的话,我可以将它隐藏在typed

c++ - 这个函数调用真的有歧义吗?

我正在学习多重继承和菱形问题,当我从最派生类进行函数调用时,VisualStudio告诉我该调用不明确:structA{virtualvoidaFunction(){cout我知道如果我在B类和C类中覆盖了基类函数,那么调用将是不明确的,但是B类和C类中的“aFunction()”不一样吗?此外,让B和C继承自A实际上可以消除错误。但是我对继承时关键字“virtual”的理解,即(Derived:virtualBase)是它阻止链中更下游的“更多派生类”继承链上游Base的多个拷贝。在继承中,可以继承多份成员变量,但只能继承一份同名函数。因此,例如,我可以有5个派生类,每个类都派生自B