草庐IT

Inheritance

全部标签

c++ - 三法则与继承

classA定义了复制运算符、析构函数和operator=。(RuleofThree)如果B继承自A:析构函数会自动调用我需要链接构造函数operator=...我应该为类B显式定义它吗? 最佳答案 不,这是不必要的。如果你仔细阅读三原则,你会注意到没有提到基类,决定完全取决于类的适当属性和行为。(Checkthisexampleonideone)#includestructA{A():a(0){}A&operator=(Aconst&rhs){a=rhs.a;return*this;}inta;};structB:A{B():b(

c++ - 如何在不重写代码的情况下实例化派生类?

假设我有一个:classA{A(inti);};classB:A{};例如,我无法实例化B(3),因为未定义此构造函数。有没有一种方法可以实例化一个使用A构造函数的B对象,而不必在所有派生类中添加“琐碎”的代码?谢谢谢谢 最佳答案 C++11有一个方法:classA{public:A(inti);};classB:A{public:usingA::A;//useA'sconstructors}; 关于c++-如何在不重写代码的情况下实例化派生类?,我们在StackOverflow上找到一

c++ - 通用基类合法吗?

这似乎可行,但我不能100%确定它是否合法,希望得到一些反馈。我有一个从通用基类派生的子类。它类似于奇怪的重复出现的模板模式,但又有所不同。在derived.h中:templateclassDerived:publicT{public:Derived();...andsomeotherstuff...};在derived.cpp中:#include"derived.h"templateDerived::Derived(){...}//definingthevariationsIneedhereavoidslinkererrors//seehttp://www.parashift.com

c++ - 在单个接口(interface)后面隐藏多个实现

我知道Strategy和AbstractFactory设计模式-但是它们不能解决我当前的问题:我正在创建一个提供非常基本的GUI的C++库。但是我希望用户能够在编译时选择使用哪个GUI库(比如Qt或FLTK)来实际呈现GUI。然而,用户应该只需要了解我的库中的方法。使用Qt后端或FLTK后端应该可以在不进行任何更改的情况下编译相同的代码。我想到了这样的事情:classA{//dothingsthatarenotspecifictoQTorFLTKhereastherearemany//methodsIwillneedindependentofthebackend}classQT_A:p

c++ - 没有用于调用的匹配函数...继承的 C++ 类中缺少重载

这个问题在这里已经有了答案:Inheritanceandmethodoverloading(1个回答)关闭9年前。谁能解释一下这是怎么回事。为什么编译器看不到类A中没有参数的hello()?structA{virtualvoidhello(){}virtualvoidhello(intarg){}};structB:A{virtualvoidhello(intarg){}};intmain(){B*b=newB();b->hello();return0;}g++main.cppmain.cpp:Infunction‘intmain()’:main.cpp:13:11:error:nom

c++ - 我可以使用类级别的 typedef 作为基类的模板参数吗?

假设一个模板化的基类:templateclassBaseClass;在其他类中,我想从中继承,其中T是一个相当复杂的类型,所以我想使用typedef。因为我不想污染命名空间,所以我希望在类定义中包含typedef:classChildClass:publicBaseClass{typedefMyVeryVeryComplicatedTypeLocalType;...}现在当然我还不能使用LocalType作为BaseClass的模板参数并且必须写两次复杂的定义(MyVeryVeryComplicatedType)。(所以我猜标题问题的答案是“否”。)问题:有没有办法只定义一次,但仍然只

c++ - 在我错的地方用 C++ 切片?

我阅读了C++中的切片问题,并尝试了一些示例(我来自Java背景)。不幸的是,我不理解某些行为。目前,我被困在这个例子中(EfficentC++第三版的替代例子)。谁能帮我理解一下?我的简单父类:classParent{public:Parent(inttype){_type=type;}virtualstd::stringgetName(){return"Parent";}intgetType(){return_type;}private:int_type;};我的简单Child类:classChild:publicParent{public:Child(void):Parent(2

c++ - 虚函数C++中的默认参数

我阅读了C++中的继承机制和虚函数。根据我的知识(在我遇到的所有示例中),继承的方法具有与父类相同的签名。我的问题如下:我知道函数默认参数值不是函数签名的一部分。我能否在父类虚函数中将此值定义为某个常量,并在派生类中声明并实现没有此默认值的重写方法。在这种情况下,当我使用指向父类的指针调用派生对象的方法时,是否会在有/没有此默认初始化的情况下调用该函数?谢谢 最佳答案 默认参数主要是语法糖,在编译时确定。另一方面,虚拟分派(dispatch)是一种运行时特性。选择与实际调用的函数一起定义的默认参数可能并不令人惊讶,但由于上述原因,这

c++ - 模板化类的特殊继承导致成员函数返回模板化类类型而不是继承类类型

假设我有一个这样的基类:templateclassBase{public:Base&operator()(constT&value){this->value=value;return*this;}Tvalue;};现在我想继承这个类来创建特定于类型的类classInheritedFloat:publicBase{}inheritedFloat;现在我尝试在一个函数中捕捉这个继承:voidfunction(constInheritedFloat&inherited){std::cout像这样调用这个函数当然没问题:intmain(){function(inheritedFloat);//

C++继承设计: avoid member duplication

假设有两个C++类,分别支持对文件描述符的只读和只写操作。classReadFd{public:ssize_tread(/**/){//readfromfile_descriptor_}protected:intfile_descriptor_;};classWriteFd{public:ssize_twrite(/**/){//writetofile_descriptor_}protected:intfile_descriptor_;};现在假设要定义一个类ReadWriteFd,它支持读写操作。我的问题是如何设计这样的读写类来避免代码重复?我不能同时继承ReadFd和WriteFd