草庐IT

c++ - 类有虚函数吗? C++

这个问题在这里已经有了答案:Testwhetheraclassispolymorphic(5个答案)关闭8年前。因此我有一个类,想判断它是否有虚函数。我考虑的第一种方式是动态转换。classA{//hiddendetails..};classB:publicA{};intmain(){A*a=newA;;B*b=dynamic_cast(a);}所以这种情况下如果A类中有虚函数,编译就会成功,否则会出现这个错误:error:cannotdynamic_cast\u2018a\u2019(oftype\u2018classA*\u2019)totype\u2018classB*\u201

c++ - 图形 API 的包装器

我非常喜欢拥有一个具有适应能力的游戏引擎,不仅在它能做什么,而且在它如何处理新代码方面。最近,对于我的graphics子系统,我编写了一个class来重写,它的工作方式如下:classLowLevelGraphicsInterface{virtualboolsetRenderTarget(constRenderTarget*renderTarget)=0;virtualboolsetStreamSource(constVertexBuffer*vertexBuffer)=0;virtualboolsetShader(constShader*shader)=0;virtualbooldr

c++ - 隐式虚拟性传播的原因是什么?

我只使用C++工作了2到3个月,最近我发现了标识符final,它位于虚函数之后。直到今天,我还相信省略virtual会阻止虚拟性的传播,但我错了。它隐式传播。我的问题是这样的。为什么允许隐式传播?为什么virtual的存在不能使函数成为虚函数而virtual的存在不能使函数不是虚函数?在某些情况下更好吗?还是在虚拟首次引入的那一天?根据Clifford'sanswer,甚至还有一个编译器会在缺少virtual时生成警告。whyisthevirtualityofmethodsimplicitlypropagatedinc我希望上面的链接能回答我的问题,但事实并非如此。----------

c++ - 为什么头文件中定义的 C++ 虚函数可能无法在 vtable 中编译和链接?

情况如下。我有共享库,其中包含类定义-QueueClass:IClassInterface{virtualvoidLOL(){dosomemagic}}我的共享库初始化类成员QueueClass*globalMember=newQueueClass();我的共享库导出C函数,它返回指向globalMember的指针-void*getGlobalMember(void){returnglobalMember;}我的应用程序像这样使用globalMember((IClassInterface*)getGlobalMember())->LOL();现在非常棒的东西-如果我不从共享库引用LOL

c++ - 具有相同名称的纯虚函数的不同实现

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Inheritinterfaceswhichshareamethodname我有两个基类I1和I2具有纯虚函数voidR()=0;.我想要派生类IImpl从I1继承和I2并为I1::R()提供不同的实现和I2::R().下面的代码在MSVS2005和2010中编译和工作。我在禁用语言扩展和警告级别4的情况下编译。没有警告也没有错误。我在gcc4.2中尝试了相同的代码。它不编译。GCC报错:error:cannotdefinememberfunction'I1::R'within'IImpl'我的问题是:为什么

c++ - 如何在派生类上强制使用静态成员?

我有一个基类Primitive,我从中派生了几个其他类--Sphere、Plane等。Primitive通过纯虚函数在其子类上强制执行某些功能,例如intersect()。intersect的计算依赖于实例数据,因此将其作为成员方法是有意义的。我的问题出现在以下方面:我希望每个派生实例都能够识别其类型,比如通过std::stringtype()成员方法。由于同一类的所有实例都将返回相同的类型,因此将type()设为static方法是有意义的。因为我也希望每个Primitive子类都实现这个方法,所以我也想把它变成一个纯虚函数,就像上面的intersect()一样。但是,C++中不允许使

c++ - 派生类调用时的虚函数性能?

如果在编译时从已知为派生类的类调用虚拟方法,是否会导致性能下降?下面我使用派生类显式调用force_speak。代码:#include#include#includeclassBase{public:virtualvoidspeak(){std::coutvoidforce_speak(std::array,3>&arr){for(auto&b:arr){b->speak();}}intmain(){std::array,3>arr={std::unique_ptr(newDerived1),std::unique_ptr(newDerived1),std::unique_ptr(ne

c++ - 用子类对象初始化的多态基类对象数组

抱歉,标题太复杂了。我有这样的东西:classBase{public:intSomeMember;Base():SomeMember(42){}virtualintGet(){returnSomeMember;}};classChildA:publicBase{public:virtualintGet(){returnSomeMember*2;}};classChildB:publicBase{public:virtualintGet(){returnSomeMember/2;}};classChildC:publicBase{public:virtualintGet(){return

c++ - @覆盖 C++?

在C++中有没有一种方法可以确保子类中的虚方法实际上覆盖了父类(superclass)虚方法?有时当我重构时,我忘记了一个方法,然后想知道为什么它没有被调用但我忘记更改方法签名以便它不再覆盖任何东西。谢谢 最佳答案 在C++11中,使用override标识符是可能的:structBase{virtualvoidfoo()const{std::cout这允许您在编译时发现您是否未能重写方法。在这里,我们忽略了使方法const:structBadDerived:virtualpublicBase{virtualvoidfoo()over

c++ - 在 C++ 中描述什么是虚函数的最简洁但准确的方法是什么?

被要求描述虚函数是什么似乎是评估基本C++知识的面试中最常见的问题之一。然而,经过几年的C++编程,我仍然有一种不舒服的感觉,即我并不真正理解如何最好地定义它们是什么。如果我查阅维基百科,我看到虚函数的定义是:"Inobject-orientedprogramming,avirtualfunctionorvirtualmethodisafunctionormethodwhosebehaviourcanbeoverriddenwithinaninheritingclassbyafunctionwiththesamesignature"这个定义看起来简单而优雅,而不是特定于C++的。但对我