草庐IT

c++ - 虚拟基类在 C++ (C++11) 中调用空构造函数

让我们看下面的代码:classA{protected:int_val;public:A(){printf("callingAemptyconstructor\n");}A(intval):_val(val){printf("callingAconstructor(%d)\n",val);}};classB:virtualpublicA{public:B(){printf("callingBemptyconstructor\n");}B(intval):A(val){printf("callingBconstructor(%d)\n",val);}};classC:publicB{pub

c++ - 防止实例化不是多态 C++ 的基类

我有一个非多态的基类,但我想阻止它被实例化。我应该给这个基类一个纯虚析构函数来防止它被实例化吗?但是给非多态基类一个虚析构函数是错误的还是不好的做法? 最佳答案 为防止基类被实例化,使所有构造函数都受到保护。 关于c++-防止实例化不是多态C++的基类,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/31537002/

c++ - 为什么派生类函数参数采用基类函数参数的值?

我正在研究C++。以下是我的代码:#includeusingnamespacestd;classbase{public:virtualvoiddisplay(inta=4){coutdisplay();return0;}输出是:Derived::64调用基类函数,但使用派生函数参数的默认值。为什么派生类方法display(),取基类方法参数值? 最佳答案 因为您是通过指向base的指针来调用它的。这就是它的工作原理。在实际调用之前,将参数压入参数堆栈(或内部寄存器)。因为您有一个指向base的指针并且没有参数,所以默认的4被传递给该

c++ - 不可访问的基类

我正在用SDL编写一个简单的游戏。我有一个类层次结构,我正在为我在游戏中使用的任何Sprite构建它。基类是Sprite,它包含碰撞框和spritesheet的数据抽象。在其正下方是两个抽象类,Character和MapObject。我目前正在实现派生自Character的Player类(敌人和NPC也将派生自抽象Character类)。无论如何,希望这是有道理的。我的问题是:当我尝试在引擎中使用播放器类时,我无法访问任何Sprite函数。我收到以下错误:'Sprite'isnotanaccessiblebaseof'Player'头文件如下:Sprite.h:classSprite{

c++ - weak_ptr 是基类的,而 shared_ptr 是派生类的?

我有一个结构来管理从基类派生的对象Entity,但不控制它们的生命周期。我希望这个结构被赋予像weak_ptr这样的弱指针这样它就可以知道该对象是否已在其他地方被销毁。但是,在共享指针所在的管理结构之外,我希望共享指针更具体shared_ptr(SpecificEntity使用Entity作为基类)。有没有什么办法可以做到这一点,或者类似的东西? 最佳答案 很有可能。您可以随时转换shared_ptr到shared_ptr隐含地,对于另一个方向你有std::static_pointer_cast和std::dynamic_point

c++ - 调用基类的重载方法

这个问题在这里已经有了答案:Inheritanceandmethodoverloading(1个回答)c++issuewithfunctionoverloadinginaninheritedclass(5个答案)关闭9年前。我有这个代码:#include#includeusingnamespacestd;classA{public:voidPrint(inti){cout这给了我一个错误:error:invalidconversionfrom'int'to'constchar*'[-fpermissive]意味着它试图在不考虑继承的重载的情况下调用B的Print。但是,A的Print应

C++如何从基类调用派生类中的方法

我想要做的是让Execute()运行并完成它调用Base::Done()然后调用Derived::Done()。我这样做是因为Base类Execute会做一些事情,当它完成时调用Derived::Done()。我希望我解释正确。有点像任务完成时调用的监听器。我有点不明白Base类将如何调用Derived类。classBase{virtualvoidDone(intcode){};voidExecute();}voidBase::Execute(){}classDerived:Base{voidDone(intcode);voidRun();}Derived::Done(intcode)

c++ - 转发构造函数调用 2 次基类的复制构造函数

以下代码将构造函数从基类转发到派生类。为什么调用2个复制构造函数?后台发生了什么?用g++编译。#includeusingnamespacestd;structA{A(){coutA(Ta);//Neededtocompile:-O};templatestructC:publicT{usingT::T;};intmain(){Aa;Cca(a);//Ccaa(ca);return0;}输出是:AA(constA&)A(constA&) 最佳答案 通过在A中定义构造函数模板,C将获得具有类似签名的构造函数模板。它的隐式定义类似于:te

C++:使用 CRTP,派生类中定义的类在基类中不可访问

这是(简化的)基类:templateclassSharedObject{protected:QExplicitlySharedDataPointerd;};这是派生的:classThisWontCompile:publicSharedObject{private:friendclassSharedObject;structData:publicQSharedData{intid;};};是否有从SharedObject访问ThisWontCompile::Data的解决方法?从基础对象派生的对象到底能做什么,不能做什么? 最佳答案

C++调用基类的模板函数

下面是两种情况。案例1)Base->BaseIndirect->DerivedIndirect情况2)基础->派生在案例2)中,我可以使用3种表示法调用基类的模板函数。在案例1)中,我可以仅使用其中一种表示法来调用Base类的模板函数。而且,我无法使用任何符号调用BaseIndirect的模板函数:(。我该如何解决这个问题?谢谢。structBase{templateinlinevoidfbase(intk){};};templatestructBaseIndirect:Base{templateinlinevoidfbaseIndirect(intk){};};templatestr