草庐IT

派生词

全部标签

c++ - 使用自动从基类返回类型与派生类的冲突

我有以下代码:structA{};structBase{virtualA&internal()=0;};structDerives:publicBase{auto&internal()override{//这无法通过冲突的返回类型进行编译(在coliru上测试-使用gcc)-我的问题是为什么编译器不能推断出internal_(因此返回类型)是A?是否在不同的编译阶段为auto推导出类型,例如与检查虚拟覆盖的编译阶段?当然,如果您将auto替换为正确的类型,则可以编译-但这不是重点。(这里是clang错误,gcc有点类似)main.cpp:8:11:error:returntypeofv

c++ - 为什么在对基类的 const 引用上调用派生类的析构函数?

在GMan'sanswerhere,restore_base类的析构函数不是virtual,所以我一直想知道它究竟是如何工作的。通常您希望restorer_base的析构函数仅在对象超出范围后执行,但派生的restorer_holder析构函数似乎真的被调用了。有谁愿意赐教吗? 最佳答案 需要虚拟析构函数的标准情况是voidfoo(){scoped_ptrobj=factory_returns_a_Derived();//...use'obj'here...}而您不的标准情况是voidfoo(){Derivedobj;//...us

c++ - 需要从 C++ 中的派生类调用基本析构函数方法?

这个问题在这里已经有了答案:DoIneedtoexplicitlycallthebasevirtualdestructor?(7个答案)关闭7年前。请考虑以下事项:classbase{base();~base();}:classderived:publicbase{};在派生类没有定义析构函数的情况下,当派生对象被析构时,是否会自动调用基类析构函数?否则,如果派生类中也有析构函数,是否必须显式调用基类析构函数?classbase{base();~base();}:classderived:publicbase{derived();~derived{base::~base();//doI

C++ - typeid(),用于派生类不返回正确的类型

也许我误解了继承在这里的工作方式,但这是我的问题:我有一个类Option和一个派生自它的类RoomOption。我有另一个类(class)房间,里面有一个shared_ptrvector。在main中,我向该vector添加了一个RoomOption。然后,使用typeid()我检查类型,它告诉我它是一个选项。根据我的阅读,typeid应该返回派生类型,而shared_ptrs不会导致切片,所以我不确定我做错了什么。代码如下:房间.h:vector>options;voidaddOption(shared_ptr);shared_ptrgetOption(int);房间.cpp:voi

c++ - 派生抽象类中的纯虚方法

假设我们有这个:classA{public:virtualvoidfoo()=0;};classB:publicA{public:virtualvoidfoo()=0;};编译器没有抛出错误,我猜是因为B也是一个抽象类,因此它不必从A实现foo。但是这样的构造是什么意思?1)B的foo是否隐藏了A的foo?2)继承自B的第一个类不是抽象类,它是否必须提供两个实现,如:classC:publicB{public:virtualvoidA::foo(){};virtualvoidB::foo(){};};编译器只会在缺少B::foo()的实现时提示,但不会提示缺少A::foo()。总而言之

c++ - 不从派生类调用基类构造函数

假设我有一个基类:classbaseClass{public:baseClass(){};};派生类:classderClass:publicbaseClass{public:derClass(){};};当我创建derClass的实例时,将调用baseClass的构造函数。我怎样才能避免这种情况? 最佳答案 创建一个额外的空构造函数。structnoprapere_tag{};classbaseClass{public:baseClass():x(5),y(6){};baseClass(noprapere_tag){};//not

c++ - 在基类中是 const 而在派生类中不是 const 的虚函数

谁能解释一下下面代码的输出结果?#include#includeclassAnimal{public:Animal(conststd::string&name):_name(name){}~Animal(){}virtualvoidprintMessage()const{std::coutprintMessage();}输出是Hello,I'mbillandmooHello,I'mbill我不明白为什么。指针animal指向Cow类型的对象。printMessage是一个虚函数。为什么Cow类的实现不是被调用的那个? 最佳答案 Co

c++ - 使用 typeid 获取派生类的名称

我正在创建一个资源管理器,它接受从类Resource派生的类。我的问题是typeid(..).name()返回错误的类名。我想像这样将纹理等资源添加到map中:typedefstd::unordered_mapResourceMap;我希望“类+计数器”的名称是资源的字符串/名称。不幸的是,所有东西最终都被称为P8Resource,因为这些类派生自“Resource”。确实是一个不合时宜的困境,但typeid必须以某种方式知道texture是一个纹理,而不是资源。classResource{};//abstractclassTexture:publicResource{};Resour

c++ - 在派生类型的对象上从基类调用虚方法

classBase{public:virtualvoidfoo()const{std::cout尝试过转换和函数指针,但我做不到。是否有可能打败虚拟机制(只是想知道是否可能)? 最佳答案 要显式调用Base中定义的函数foo(),请使用:d.Base::foo(); 关于c++-在派生类型的对象上从基类调用虚方法,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2787756/

c++ - 如何从基类派生 ATL COM 类?

“ATL简单对象”向导不提供指定新类派生自现有组件类及其接口(interface)的方法。在VisualStudio2008中,我如何创建一个从现有类派生的新ATLCOM类(即Base实现IBase,我想创建一个新的Derived派生自实现IDerived的Base的类,其中IDerived派生自IBase。)更新:听起来很简单,但是一个向导生成的ATL类最多有六个基类,一个COM映射和一个连接点映射。这些基类和映射中的哪些应该在派生类中重复?如果在派生类中重复映射,它们应该包含基类映射的内容还是仅包含附加项?基类的顺序重要吗?FinalConstruct()和FinalRelease