草庐IT

Inheritance

全部标签

c++ - 具有派生成员函数指针的多态性?

(我看到之前有人在SO上提出过类似的问题,但我看到的问题似乎并没有完全触及我的用例。特别是,我想知道我的编译失败是错误的结果,或者是我尝试的结果是verboten。)背景我希望实现委托(delegate)模式,用于事件处理。我认为也许满足我需求的最佳方法是成员函数指针映射,由std::string索引(代表事件类型。)我开始尝试使用std::function来完成此操作,但遇到了一些问题,然后决定仅使用原始MFP进行尝试。(我仍然愿意考虑std::function,我会接受一个答案,该答案显示了如何使用该方法在下面完成我的确切需求。但我仍然想知道有什么问题我目前的方法。)我能够通过一个

C++ 模板分支

我有一个有趣的案例,尝试在模板函数中创建分支,其中路径取决于模板类型实现的接口(interface)。然后该分支确定返回值的构造函数。我不确定这种类型的分支是否可行。另一种方法是将函数拆分为两个不同的函数,并让用户调用与所需分支相对应的函数。我的问题有两个:如何根据接口(interface)实现执行if语句?当接口(interface)未实现时,我如何获得要编译的函数?例如int没有带两个参数的构造函数。templateTGetObject(){//IfTimplementsinterface,callinterfaceconstructorif(typeid(T)implements

c++ - 虚拟继承构造函数选择

为什么打印20000?代码在继承序列中一直显式调用特定的基础构造函数,但忽略指定的构造函数并改用默认构造函数。#includestructCar{Car():price(20000){}Car(doubleb):price(b*1.1){}doubleprice;};structToyota:publicvirtualCar{Toyota(doubleb):Car(b){}};structPrius:publicToyota{Prius(doubleb):Toyota(b){}};intmain(intargc,char**argv){Priusp(30000);std::cout

c++ - 禁止在派生类中使用默认构造函数,C++

有什么方法可以创建基类(例如boost::noncopyable)并继承它,这将禁止编译器为派生类生成默认构造函数,如果它不是由用户(开发者)?例子:classSuperDad{XXX:SuperDad();//=delete?};classChild:YYYSuperDad{public:Child(inta){...}};结果:intmain(){Childa;//compileerrorChildb[7];//compileerrorChildc(13);//OK} 最佳答案 将构造函数设为私有(private)。protec

c++ - 需要理解语句 "Accessability is checked statically and not dynamically in C++"

我对静态或动态检查访问说明符感到困惑。据说不会动态检查访问说明符。这是什么意思?这个例子取自不同的posts所以。考虑这个例子示例A:classBase{public:virtualvoidMessage()=0;};classIntermediate:publicBase{//IsMessagemethodvirtualheretoo?isitprivateorpublic?};classFinal:publicIntermediate{voidMessage(){cout现在假设我做这样的事情Final*finalPtr=&final;finalPtr->Message();上面的

c++ - 继承带有默认参数的构造函数?

C++Primer(第5版)第629页指出:如果基类构造函数有默认参数,则这些参数不会被继承。我自己试过了,在我看来,编译器生成的派生构造函数似乎也具有与基本构造函数相同的默认参数。这里有一个小测试:#includestructBase{Base()=default;Base(intx_,inty_=88,intz_=99):x(x_),y(y_),z(z_){}virtualvoiddebug()const{std::cout(您可以在此处运行-http://coliru.stacked-crooked.com/a/26cbb85757c1f021)那么我们是否也继承了继承构造函数的

c++ - 不能调用基类保护函数?

我无法在我的基类中调用protected函数。为什么?它看起来像这样:classB:B2{public:virtualf1(B*)=0;protected:virtualf2(B*){codehere();}}classD:publicB{public:virtualf1(B*b){returnf2(b);}protected:virtualf2(B*b){returnb->f2(this);}}在msvc中,我收到错误错误C2248:“name::class::f2”:无法访问类“name::class”中声明的protected成员在gcc中我得到错误:'virtualintnam

c++ - "unspecialized class template can' t be used as a template argument”是什么意思?

我有一个名为AbstractRManagers的类,我想从一个单例模板类Singleton继承,但是abstractRmanager需要成为一个模板类我遇到了一些没有用的奇怪错误代码,我已经尝试查找它但是没运气。templateclassAbstractRManagers:publicSingleton{errorC3203:'AbstractRManagers':unspecializedclasstemplatecan'tbeusedasatemplateargumentfortemplateparameter'Type',expectedarealtype

c++ - 为什么我不能访问作为参数传递给函数的基类的 protected 成员变量?

This答案似乎表明它应该可以工作,那么为什么我的示例会引发编译器错误:classClass1{protected:longm_memberVar;};classSubClass1:publicClass1{public:voidPrintMember(Class1memberToPrintFrom){Console::Write("{0}",memberToPrintFrom.m_memberVar);//[编辑]-根据Need4Sleep的建议将子类更改为公共(public)继承,但这没有区别。 最佳答案 在这个答案中,我假设您

c++ - 具有私有(private)继承的派生类中的友元函数

如果一个Derived类是从一个Base类私有(private)继承的,并且Derived类有一个友元函数f(),那么f()可以访问Derived类和Base类的哪些成员。classBase{public:inta;protected:intb;private:intc;};classDerived:privateBase{voidfriendf(){}public:intd;protected:inte;private:intf;};我理解如果一个类是从基类私有(private)继承的,那么在派生类中一切都是私有(private)的。但为什么在上面的代码中,函数f()可以访问a、b、