草庐IT

Inheritance

全部标签

c++ - 使用指令、重载的私有(private)继承?

我在一个项目中使用私有(private)继承,在“根据”意义上实现。基类定义了operator[],这是我想要使用的功能。因此,我有classA:privateB{usingB::operator[];//...};但是,如何控制我得到的operator[]版本?事实上,我需要不止一个,包括const和非const版本。这能实现吗? 最佳答案 我的理解是您的using应该自动引入运算符的所有不同重载。您是否希望将某些重载排除在子类之外?在这种情况下,最好将工作拆分为父级中几个不同名称的函数,并且只使用您需要的函数。

c++ - 使用模板元编程计数?

一段时间以来,我一直在尝试为这个问题想出一个创造性的解决方案(开启和关闭),但我还没有做到。我最近认为它可能可以通过模板元编程来解决,但由于我相对缺乏该技术的经验,我不确定。是否可以使用模板元编程(或C++语言的任何其他机制)来计算从某个基类派生的类的数量,以便为每个派生类分配一个唯一的静态类标识符?提前致谢! 最佳答案 没有。这是一个在实践中经常出现的问题,据我所知只有两种解决方案:手动为每个派生类分配ID。以非确定性方式动态地延迟生成ID。你做第二个的方式是这样的:classBase{virtualintgetId()const

c++ - 关于C++虚拟继承的问题

以下代码来自《InsidetheC++objectmodel》一书#includeusingnamespacestd;classX{};classY:publicvirtualX{};classZ:publicvirtualX{};classA:publicY,publicZ{};intmain(){cout在我的电脑(Windows,VS2010)中,输出是:1448这是我的问题1,sizeof(X)=1书上说当X类型生成两个实例时,说xa和xb。编译向A中插入一个字节,以便xa和xb可以具有不同的地址。我不太明白原因。2,sizeof(Y)=4通过使用虚拟继承,我们会不会有一个额外

c++ - 重载虚函数集的部分继承

我以为我了解继承、虚函数和函数重载,但我有一个案例让我无法理解这些特性之间的相互作用。假设我有一个包含重载虚函数的简单基类,以及从它派生的第二个类:classb{public:virtualintf(){return1;}virtualintf(int){return2;}};classd:publicb{public:virtualintf(int){return3;}};请注意,派生类d仅覆盖了一个重载虚函数。我可以实例化d类的对象并在其上调用f(int),没问题:dx;std::cout但是当我尝试调用0参数函数时:std::cout失败了!gcc说“没有匹配函数来调用‘d::f

c++ - 派生类模板中的条件覆盖

我有一个Container类,它包含一些对象,这些对象的类型可以派生自某些基类(TypeA、TypeB等)的任意组合.).Container的基类具有返回指向所包含对象的指针的虚方法;如果包含的对象不是从预期的类派生的,这些应该返回nullptr。我想根据Container的模板参数有选择地覆盖基础方法。我尝试如下使用SFINAE,但它无法编译。我想避免为每种可能的组合专门化Container,因为可能有很多组合。#include#includeusingnamespacestd;classTypeA{};classTypeB{};classTypeAB:publicTypeA,pub

c++ - 继承模板方法

我有一个类似于下面的类:classSomeClass{public:templatevoiddoSomething(Args&&...args);//...othermethodsetc.};然而,我真正想要的是有两种不同的SomeClass。理想情况下,我可以从一个通用接口(interface)派生出SomeOtherClass,但我需要有一个不同的doSomething实现,并且模板化方法不能是虚拟的。我可以制作一个模板化类,但是每个采用其中之一(并且有很多)的方法本身都必须是模板等。我能想出的最好办法是在基类中实现两种类型的doSomething并让该方法调用虚拟方法来确定在运行

c++ - 具有继承的嵌套类的名称查找

这是否保证有效:structA{structGold{};};structB:publicA{typedefGoldBaseGold;structGold{};};structC:publicB{typedefGoldBaseGold;structGold{};};static_assert(is_same::value,"Nottherighttreasure!");static_assert(is_same::value,"Nottherighttreasure!");它似乎适用于VS2010。显然它依赖于微妙的声明顺序/名称查找规则,所以我想知道标准对此事的看法......

c++ - 继承特化的模板参数推导

考虑this代码:#includetemplatestructBB{};templatestructBB:BB{};structDD:BB{};templatevoidff(BB){}intmain(){ff(BB{});ff(DD{});//FAILS!'BB'isanambiguousbaseclassof'DD'return0;}ff(DD{})的来电无法编译,因为gcc-8.3不想从BB中选择一个和BB(clang做同样的事情)。但是BB是BB,那么为什么只是BB选不出来?!问题是:这是否符合标准,在定义ff时是否有解决方法?或BB帮忙gcc-8.3挑选BB?

c++ - 如何在 C++ 中使用 override 关键字进行多重泛型继承?

我有一个通用的IDetachable接口(interface),它提供了一个方法:templateclassIDetachable{public:virtualTdetached()const=0;};我有这些示例类:classA:publicIDetachable{virtualAdetached()constoverride{//someimplementationwhichreturnsadetachedAobject}};继承B时出现的问题:classB:publicA,publicIDetachable{virtualBdetached()constoverride{//so

C++: protected 类构造函数

如果一个类总是要被继承,那么让构造函数protected有意义吗?classBase{protected:Base();};classChild:protectedBase{public:Child():Base();};谢谢。 最佳答案 只有在您不希望客户端创建Base的实例时才有意义,而是您希望它成为某些[derived]类的基类,和/或希望它成为由Base的friend使用(参见下面的示例)。请记住,protected函数(和构造函数)只能从派生类和friend类中调用。classSample;classBase{friend