这个问题的灵感来自评论here.考虑以下代码片段:structX{};//novirtualmembersstructY:X{};//mayormaynothavevirtualmembers,doesn'tmatterY*func(X*x){returndynamic_cast(x);}一些人建议他们的编译器会拒绝func的正文.但是,在我看来,这是否由标准定义取决于x的运行时值。.来自第5.2.7节([expr.dynamic.cast]):Theresultoftheexpressiondynamic_cast(v)istheresultofconvertingtheexpres
在thisanswer,出现了以下场景:#includestructA{};structB{virtual~B(){}};structAA{};templatestructC:A,T{};intmain(){B*b=newC;AA*aa=newC;assert(dynamic_cast(b));assert(dynamic_cast(aa));//thislinedoesn'tcompile,asexpected}在g++4.8.4(Ubuntu)上,它编译并且断言通过。我的问题是,这真的合法吗?我觉得您根本不应该将dynamic_cast转换为非多态类,但我坦率地承认,我不是这里发生
首先,我是一名Java编码员,想了解C++中的多态性。我为学习目的编写了示例:#includeusingnamespacestd;classA{public:virtualvoidfoo(){std::cout我预计overridenfoo会被打印出来,但事实并非如此。为什么?我们覆盖了classB中的方法foo,我认为应该调用哪个方法的决定是根据对象的运行时类型做出的,在我的例子中是B,但不是静态类型(在我的例子中为A)。实时示例是there 最佳答案 当你这样做时:Ac=B();您正在将B值转换为A。你不想这样。您应该创建一个B
std::type_info被指定为多态有什么原因吗?析构函数被指定为虚拟的(并且在C++的设计和演进中对“使其具有多态性”的效果进行了注释)。我真的看不出一个令人信服的理由。我没有任何具体的用例,我只是想知道它背后是否有任何理由或故事。以下是我提出并拒绝的一些想法:这是一个可扩展点-实现可能会定义子类,然后程序可能会尝试将dynamic_cast一个std::type_info到另一个实现定义的派生类型。这可能是原因,但实现添加一个实现定义的成员似乎同样容易,这可能是虚拟的。无论如何,希望测试这些扩展的程序必然是不可移植的。这是为了确保在delete基指针时正确销毁派生类型。但是没有
比较这两种技术的优点/缺点是什么?更重要的是:为什么以及何时应该使用一个而不是另一个?这只是个人品味/偏好的问题吗?尽我所能,我还没有找到其他明确解决我问题的帖子。在有关多态性和/或类型删除的实际使用的许多问题中,以下似乎是最接近的,或者看起来如此,但它也没有真正解决我的问题:C++-&CRTP.Typeerasurevspolymorphism请注意,我非常了解这两种技术。为此,我在下面提供了一个简单、独立的工作示例,如果觉得不必要,我很乐意将其删除。但是,该示例应阐明这两种技术对我的问题的意义。我对讨论命名法不感兴趣。另外,我知道编译时和运行时多态性之间的区别,尽管我认为这与问题无
由于我的设备,我无法使用虚拟功能。假设我有:classBase{voiddoSomething(){}};classDerived:publicBase{voiddoSomething(){}};//inanyplace{Base*obj=newDerived;obj->doSomething();}obj->doSomething()将只调用Base::doSomething()Base*obj有没有办法调用Derived的doSomething?我知道我可以在Base的doSomething()之前放置一个virtual来解决问题,但我受限于我的设备,编译器不支持。
我了解动态/静态多态性取决于应用程序设计和要求。但是,如果可能的话,是否总是选择静态多态性而不是动态多态性?特别是,我可以在我的应用程序中看到以下两种设计选择,这两种选择似乎都被建议不要使用:使用CRTP实现静态多态性:没有vtable查找开销,同时仍以模板基类的形式提供接口(interface)。但是,使用大量的switch和static_cast来访问正确的类/方法,这是危险的动态多态性:实现接口(interface)(纯虚拟类),为访问器/突变器等微不足道的函数关联查找成本我的应用程序对时间非常关键,所以我赞成静态多态性。但是需要知道使用过多的static_cast是否表明设计不
我问这个问题是引用this所以问题。DonStewart接受的答案:第一行说“您的代码是高度多态的,将所有浮点变量更改为Double..”,它提供了4倍的性能提升。我对在Haskell中进行矩阵计算很感兴趣,我应该养成编写高度单态代码的习惯吗?但是有些语言很好地利用了临时多态性来生成快速代码,为什么GHC不会或不能?(阅读C++或D)为什么我们不能为Haskell提供blitz++或eigen之类的东西?我不明白GHC中的类型类和(临时)多态性是如何工作的。 最佳答案 对于多态代码,通常需要在代码大小和代码速度之间进行权衡。要么为要
我想知道如何使用引用而不是指针来实现多态性。为了澄清,请参见以下最小示例:classA;classB{public:A&a;/////////////////这可以编译并且可以工作,但是这里最重要的一点是#1行中的a是一个引用,所以为了能够多态地使用它(这是一个实际的词吗?),如#3行所示,我必须通过取消引用来“将指针转换为引用”。这让我觉得有点奇怪,我想知道是否有更好的(在cleaner的意义上)方法。只有我吗?基本原理如果我根本不需要new那就太好了,但是在声明(!)B时,我不知道如何创建A1(!)asA是前向声明-A1与B在相同的编译单元中实现。不过,在这种情况下是否真的需要动态
文章目录一、多态的概念1.1.多态的构成条件二、虚函数2.1.虚函数的重写2.2.虚函数重写的例外协变:父类与子类虚函数返回值类型不同析构函数的重写(基类与派生类析构函数的名字不同)三、C++11override和final3.1.final:修饰虚函数,表示该虚函数不能再被重写3.2.override:检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错四、重载、覆盖(重写)、隐藏(重定义)的对比五、抽象类5.1.抽象类有什么用六、多态的应用场景举例七、多态的实现原理7.1.虚函数表虚表存在哪里虚表是什么阶段初始化的7.2.虚表如何实现多态八、多继承关系的虚函数表总结补充内容子类的