草庐IT

c++ - 如果虚拟表是在编译时创建的,那么为什么我们称其为运行时多态性呢?

既然虚拟表是在编译时创建的,那为什么我们在c++中称之为运行时多态性呢? 最佳答案 因为查找发生在运行时。 关于c++-如果虚拟表是在编译时创建的,那么为什么我们称其为运行时多态性呢?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13954950/

c++ - C++如何在内部实现多态性?

尊敬的先生!我应该告诉你我所知道的和我不知道的问题,这样你就可以解决我理解的薄弱环节。我知道c++通过使用指针数组的Vtable来实现多态性每个指针指向类的虚函数,层次结构中的每个类都有一个vtable。现在假设我有以下类(class)classperson{charname[20];public:person(char*pname){strcpy(name,pname);}virtualvoidshow(){cout现在假设我在主程序中编写person*ptr;ptr=newteacher(16,"Zia");ptr->show();现在我在这一点上感到困惑,调用将转到基类的显示函数

c++ - 在 C++11 中,您能否将引用的基类传递给线程的构造函数并获得多态行为?

我观察到VisualStudio11Beta中的新库与使用thread()和ref()的Boost之间的行为差​​异。我想知道谁是对的。如果标准偏离了Boost的原始实现,则两者都可能。(但我不打算尝试破译标准语......)我会用MinGW试一试......唉,据我所知,不适用于MinGW。那么,第一个问题是,gcc和Clang是否表现出相同的编译失败?如果他们不这样做,我将针对VS提交错误。第二个问题可能是,如果编译失败是正确的,我的解决方法是什么来获得Boost给我的东西(除了继续使用Boost)?我想我确实有第三个问题...我正在做的事情是否符合犹太洁食标准?classbase

通用(多态)lambda 的 C++17 vector

C++14引入了通用lambda(当在lambda的签名中使用auto关键字时)。有没有办法用C++17将它们存储在vector中?我知道这个现有问题,但它不符合我的需要:CanIhaveastd::vectoroftemplatefunctionpointers?这是一个示例代码,说明了我想做什么。(回答前请看底部的注释)#include#includestructA{voiddoSomething(){printf("A::doSomething()\n");}voiddoSomethingElse(){printf("A::doSomethingElse()\n");}};str

c++ - 测试一个类是否是多态的

我们有一个子项目“commonUtils”,它有许多在父项目中使用的通用代码片段。我看到的一个这样有趣的东西是:-/*********************************************************************IfTispolymorphic,thecompilerisrequiredtoevaluatethetypeidstuffatruntime,andanswerwillbetrue.IfTisnon-polymorphic,thecompilerisrequiredtoevaluatethetypeidstuffatcompileti

c++ - 以非多态方式调用虚函数的成本是多少?

我有一个纯抽象基类和两个派生类:structB{virtualvoidfoo()=0;};structD1:B{voidfoo()override{cout在A点调用foo与调用非虚拟成员函数的成本相同吗?或者它是否比D1和D2不是从B派生的更昂贵?intmain(){D1d1;D2d2;std::vectorv={&d1,&d2};d1.foo();d2.foo();//PointA(polymorphismnotnecessary)for(auto&&i:v)i->foo();//Polymorphismnecessary.return0;}答案:AndyProwl的答案是正确的答

c++ - 这个递归多态 C++1y lambda 调用有什么问题?

我在Clang上玩弄多态可变参数lambda,发现Clang不喜欢这个#includeintmain(){autoappend=[](auto&&cnt,auto&&me,auto&&a,auto&&p1,auto&&...p)->decltype(auto){if(sizeof...(p)>cnt)returnme(++cnt,me,a它的目的是输入“1234”。一个0被附加到参数列表(并且每次从前面取出一个参数)并且一个计数器监视我们何时需要停止,因为我们会碰到一个虚拟的0。但是Clang提示fatalerror:recursivetemplateinstantiationexce

c++ - 解决这个多态性问题的最优雅的方法

编辑:我正在使用C++。因此,我正在创建方法/函数来测试形状之间的交集。我基本上有这个:classShape{};classRectangle:publicShape{};classCircle:publicShape{};classLine:publicShape{};现在,我需要决定编写实际方法/函数来测试交集的最佳方式。但是我所有的形状都将存储在一个形状指针列表中,所以我将调用基本形式的方法/函数:boolintersects(Shape*a,Shape*b);此时,我需要确定形状“a”和“b”的类型,以便正确检测碰撞。我可以轻松地完成其中之一,只需使用一些虚拟方法:classS

c++ - 为什么取消引用运算符在 C++ 中保留多态性(后期绑定(bind))?

众所周知,“仅当调用是通过引用或指针。”。因此,当我发现解引用运算符也保留了动态绑定(bind)特性时,我感到很惊讶。#includeusingnamespacestd;structB{virtualvoidsay(){cout输出是HelloD问题:编译器如何处理取消引用运算符*?我以为是在编译时完成的。因此,当编译器引用指针p时,它应该假定p指向B类型的对象。例如,以下代码Dtemp=(*p);提示error:noviableconversionfrom'B'to'D' 最佳答案 从表面上看,这是一个有趣的问题,因为没有一元*的

c++ - 如何在堆栈上创建多态对象?

如何在堆栈上分配多态对象?我正在尝试做类似的事情(试图避免使用新的堆分配)?:A*a=NULL;switch(some_var){case1:a=A();break;case2:a=B();//BisderivedfromAbreak;default:a=C();//CisderivedfromAbreak;} 最佳答案 你不能构造一个函数来像那样工作,因为在条件block内创建的自动或临时对象不能将它们的生命周期延长到包含block中。我建议将多态行为重构为一个单独的函数:voiddo_something(A&&);switch(