如何在C++中实现这个流畅的接口(interface):classBase{public:Base&add(intx){return*this;}}classDerived:publicBase{public:Derived&minus(intx){return*this;}}Derivedd;d.add(1).minus(2).add(3).minus(4);当前代码不工作,因为基类对派生类等一无所知。如果有提示/建议,我将不胜感激。 最佳答案 使基类模板化。使用所需的Base模板类型返回类型,如下所示:templateclass
虽然我还不想尝试运行它,但它编译得很好。然而……//classbase;//classderived;//classderived:publicbase;classbase{};classderived:publicbase{};classother{public:voidfunc(){base1=derived1;}base*base1;derived*derived1;};voidmain(){}...将类other移动到base和derived的定义之上,为此我必须在我的程序中做类似的事情会导致编译错误。明显的解决方案是在代码顶部注释掉前向声明基和派生,但这会导致无法在基*和派生
我有以下类关系。我想克隆Derived类,但出现错误“无法实例化抽象类”。我如何克隆派生类?谢谢。classBase{public:virtual~Base(){}virtualBase*clone()const=0;};classDerived:publicBase{public:virtualvoidfunc()=0;virtualDerived*clone()const{returnnewDerived(*this);}}; 最佳答案 只能实例化具体类。您必须重新设计Derived的界面才能进行克隆。首先,去掉virtualv
我在一次采访中被问到这个问题。我无法在那里回答这个问题。我现在也无法理解为什么输出是这样的。这是代码:#includeusingnamespacestd;classBase{public:virtualvoidfun(intx=0){coutfun();d1.fun();d1.fun(1.2);return0;}以上代码的输出为:Base::fun(),x=0Derived::fun(),x=10Derived::fun(),x=1.2问题是:在第一种情况下,我们说fun()函数都被重载了(并且没有被覆盖,因为它们的声明不同)并且调用了基础fun(),但是fun()的这些声明不可能被重
我想将一些基本信息注入(inject)到它可以构建的派生类中。派生类不应该关心初始化这些信息,它应该就在那里。仅此一项就可以通过继承轻松实现。但问题是基类自己并不知道这些值。相反,它们需要作为参数传入。但是,由于派生类不需要处理这个问题,因此通过派生构造函数隧道传输参数并调用基类构造函数是不可行的。我能想到的唯一解决方案是使信息静态可用,以便基类可以在没有帮助的情况下获取它们。但我想避免这种情况。是否有某种方法可以先创建和初始化基类,然后再将实例扩展为派生类型?如果不是,我如何使用C++的可用功能实现这种创建顺序和依赖关系?#include#includeusingnamespaces
Bjarne建议使用if中的条件作为范围限制。特别是这个例子。if(doubled=fd()){//dinscopehere...}我很好奇如何从真/假意义上解释声明。这是一个声明这是双倍的。编辑:在6.3.2.1C++编程语言中作为推荐。Edit2:templatetypedefs对指针的建议,尤其是动态转换,可能会深入了解Bjarnes的建议。SteveJessop告诉我:-条件不是表达式,它也可以是声明,使用的值是被评估的值。 最佳答案 您看到的代码是一种专门用于在if语句中声明变量的技术。你通常会看到这样的东西:if(T*p
unique_ptr的容器似乎没有什么意义:你不能将它与初始化列表一起使用,而且我无法遍历容器(下面的解决方法)。我误会了什么吗?或者什么时候使用unique_ptr有意义和STL容器?#include#includeusingnamespacestd;structBase{voidgo(){}virtual~Base(){}};//virtual~Base()=default;gives//"declaredvirtualcannotbedefaultedintheclassbody"why?classDerived:publicBase{};intmain(){//vector>v
在C++中-假设派生类派生自基类,并且基类中有一个虚拟方法被派生类覆盖。谁能告诉我一个现实生活场景,其中派生类版本的虚函数可能需要调用基类版本的虚函数?例子,classBase{public:Base(){}virtual~Base(){}virtualvoiddisplay(){cout 最佳答案 每当您还需要基类行为但不想(或不能)重新实现它时,您就会这样做。一个常见的例子是序列化:voidDerived::Serialize(Container&where){Base::Serialize(where);//nowserial
取自:http://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/为什么要写:autopb=unique_ptr{make_unique()};不仅仅是:autopb=make_unique();我唯一的猜测是,如果我们想要auto,我们需要帮助它推断出正确的类型(这里是base)。如果是这样,那么对我来说这将是一个值得怀疑的优点..键入auto然后在=的右侧键入大量初始化..我错过了什么? 最佳答案 嗯,重点是第一个选项使pb一个uni
在这段代码中:classBase{public:virtualvoidmethod()=0;};classDerived1:publicBase{public:virtualvoidmethod()override{}};classDerived2:publicBase{public:voidmethod()override{}};Derived1和Derived2有区别吗? 最佳答案 摘自c++11标准(草案n3337)的10.3虚函数第2点:Ifavirtualmemberfunctionvfisdeclaredinaclass