几天前,我想深入了解C++世界。我正在研究基类和派生类的概念。有人可以解释以下两个代码片段的细微差别吗?classA{private:virtualintGetValue(){return10;}public:intCalculate(){returnGetValue()*1.5;}};classB:publicA{private:virtualintGetValue(){return20;}};intmain(){Bb;std::coutTheoutputis30but15wasexpectedclassA{private:intm_data;public:A():m_data(Ge
如果我有一个Base类,它至少有一个虚函数,还有一个Derived类单独继承自它,那么(uintptr_t)derived-(uintptr_t)static_cast(derived)保证(由ItaniumABI)为零,即使Derived不是标准布局。然而,在一般情况下,这不一定是正确的(例如多重继承)。是否可以编写一个特征来检测一个类是否是另一个类的主要基类?ItaniumABI的有用部分:http://refspecs.linux-foundation.org/cxxabi-1.83.html主要基类Foradynamicclass,theuniquebaseclass(ifan
我知道有很多关于这个主题的帖子,但我找不到任何帖子来完全回答我的问题。假设我有一个基类和一个派生类,我为它实现了一个CCtor和一个赋值运算符,如下所示:classBase{char*name;....Base(constBase&other):name(nullptr){*this=other}voidoperator=(constBase&other){...Deepcopyofname}}classDerived:publicBase{....Derived(constDerived&other){*this=other;}voidoperator=(constDerived&o
我有以下基类classGrammateas{public:Grammateas(std::stringname):_name(name){};virtual~Grammateas(){};private:std::string_name;};和下面的派生类classBoithosfinal:publicGrammateas{public://usingGrammateas::Grammateas;Boithos(inthours):Grammateas("das"),_hours(hours){};virtual~Boithos(){};private:int_hours;};我想使用
在pre-11C++中我有这样的东西:templatestructFoo:T,U,V{boolinit(){if(!T::init()||!U::init()||!V::init())returnfalse;//dolocalinitandreturntrue/false}};我想将其转换为C++11可变参数语法以获得灵活长度参数列表的好处。我理解使用递归解压模板arg列表的概念,但我看不到正确的语法。这是我尝试过的:templatestructFoo:Features...{templateboolrecinit(F&arg,G&&...args){if(!F::init())ret
我有一个基类Base,许多其他类将派生自。我想定义:templateostream&operator但仅适用于从Base派生的类.我需要所有以前定义的operator用于其他类型。怎么做?那可能吗?我无法创建ostream&operator,因为我需要在某些类型特征中使用确切的类型。有什么方法可以在将值作为基类型传递的同时“推送”派生类型吗? 最佳答案 http://www.boost.org/doc/libs/1_46_0/libs/utility/enable_if.htmlhttp://www.boost.org/doc/li
代码如下:代码:#includeusingnamespacestd;classAnimal{inta;public:Animal(inta):a(a){}intgeta(){returna;}};classBird:virtualpublicAnimal{stringb;public:Bird(inta,stringb):Animal(a),b(b){}};classFish:virtualpublicAnimal{intf;public:Fish(inta,intf):Animal(a),f(f){}};classUnknown:publicBird,publicFish{charu
为什么不建议虚基类中有数据成员?函数成员呢?如果我有一个所有派生类共有的任务,虚拟基类是否可以执行该任务,或者派生类是否应该继承两个类-从虚拟接口(interface)和执行任务的普通基类?谢谢。 最佳答案 作为一种实践,您应该只使用虚拟继承来定义接口(interface),因为它们通常与多重继承一起使用,以确保派生类中只存在该类的一个版本。纯接口(interface)是最安全的多重继承形式。当然,如果您知道自己在做什么,您可以随意使用多重继承,但如果您不小心,它可能会导致代码脆弱。虚拟继承的最大缺点是它们的构造函数是否带有参数。如
我正在尝试使用std::bind()创建一个函数,该函数将调用虚函数的基类版本而不是调用派生类的版本。structBase{virtualvoidfoo(){cout我从elsewhere了解到你通常不能以这样的“反虚拟”方式调用基本函数。明显的异常(exception)是通用范式:voidDerived::bar(){Base::bar();}由于表达式Base::bar()在Derived的方法中被识别为“反虚拟”(在我暗示的意义上),是否可以绑定(bind)到Base::bar()以在Derived的一种方法中所需的方式?例如。像这样的东西:voidDerived::bar(){
假设我有一个抽象基类Parent和子类Child1和Child2。如果我有一个接受Parent*的函数,有没有办法(可能使用RTTI?)在运行时确定该函数实际接收到的是Child1*还是Child2*?到目前为止,我在这里使用RTTI的经验是,当foo是父类*时,typeid(foo)返回typeid(Parent*),而不管foo是哪个子类的成员。 最佳答案 你需要查看解引用指针的typeid,而不是指针本身;即,typeid(*foo),而不是typeid(foo)。询问取消引用的指针将为您提供动态类型;如您所见,询问指针本身只