草庐IT

Inheritance

全部标签

c++ - C++中的虚拟继承和统一初始化

跟进thisquestionaboutmultiple(virtual)inheritance,我想询问一个简单的MWE,它使g++5.2.0不高兴,而clang++3.6.2处理得很好,没有任何提示,即使-Wall和-Wextra设置。所以这是MWE:classZ{};classA:virtualZ{protected:A(){}};classB:virtualZ{protected:B(){}};classC:A,B{public:C():A{},B{}{}};intmain(){Cc{};return0;}与clang++不同,g++的报错是这样的:gccodd.c++:Inco

c++ - 重载抽象运算符时出现 Clang 链接器错误=

VisualStudio2013编译器可以很好地处理以下代码,但clang5.0和6.2给我一个链接器错误:#includeusingnamespace::std;classIBase{public:virtualIBase&operator=(constIBase&other)=0;};classBase:virtualpublicIBase{public:Base&operator=(constIBase&other)override{constBase&b=dynamic_cast(other);return*this=b;}virtualBase&operator=(const

c++ - 在具有存储基成员的基类的派生类中使用/存储派生成员

我经常遇到的情况是有一组类,Base和Derived,其中Base类拥有基类成员的所有权BaseMember,和Derived类具有指向同一对象的引用或指针,但作为DerivedMember.例如,包含具有某些特殊控制功能的某类控件的特定实例的UI面板类继承自包含通用控件并具有通用控制功能的通用类。首先说BaseMember由DerivedMemeber继承.如果不使用智能指针,我可能会这样做:classBase{protected://receiveownershipbutonlybecausewesayso,//someoneelsecanstilltrytodeleteasit'

C++:接口(interface)强制定义copy-constr

有没有什么方法可以让接口(interface)类强制执行复制构造函数的定义,也许还有其他构造函数的定义?在我的例子中,我有一个IResource纯抽象类,我希望所有实现此接口(interface)的类都定义一个复制构造函数、一个用于从文件加载的构造函数和一个用于从内存加载的构造函数. 最佳答案 为了构造一个对象,您需要知道要使用的具体类(否则它怎么知道要分配多少内存,或者要使用哪个虚拟表,等等?)。因此,在处理构造函数时接口(interface)不起作用,您不能使用接口(interface)(纯虚拟)来强制存在这样的构造函数。当你想

C++多重继承函数合并

我有:classXILightSource{public:virtualXVec2position()const=0;};classXLightSprite:publicXSprite,publicXILightSource{};问题是XSprite已经有相同的函数position。我怎么能告诉编译器,我想使用XSprite::position函数作为XILightSource::position()的实现? 最佳答案 覆盖它并调用XILightSource::position():classXLightSprite:publicX

c++ - 构造函数和析构函数继承

我认为基类中的构造函数和析构函数不能被基类的派生类继承。我的理解对吗? 最佳答案 你的理解是正确的。例如,如果您有classBase{Base(inti){}};classDerived:publicBase{};Derivedd(3);这不会编译,因为Base构造函数不是继承的。请注意,如果可能,默认构造函数和复制构造函数由编译器创建,并调用基类的相应构造函数,因此对于这些构造函数,看起来好像它们是继承的。 关于c++-构造函数和析构函数继承,我们在StackOverflow上找到一个

c++ - 是否有可能确定/断言,如果一个虚函数被覆盖,另一个虚函数也被覆盖?

我有一个声明虚方法并定义默认实现的现有类。现在我想用differend参数重载该方法并提供默认实现。此外,我想强制执行约束,即如果第一个方法被子类覆盖,那么第二个(重载的)虚拟方法也必须被覆盖。在C++中这甚至可能吗?如果可以,是否可以在编译时实现?示例代码:classParamA{};classParamB{};classBase{public:virtualvoidmethod(ParamAa){//defaultbehavior}virtualvoidmethod(ParamBb){//defaultbehavior}}classDerived:publicBase{public

c++和注入(inject)的基本名称

以下代码不能在gcc中编译:namespaceOne{classA{};};namespaceTwo{classA{public:voidwhat(){cout它给出:gccbug.cpp:Inconstructor‘Two::B::B()’:gccbug.cpp:23:error:‘classOne::A’hasnomembernamed‘what’现在,有人告诉我这是正确的行为(由于注入(inject)了One::A的基本名称,使A引用One::A)。但是,此代码在C#中编译(好吧,在更改了一些内容之后),因此这似乎是特定于C++的。我想知道的是..为什么?将基本名称“One::A

c++ - protected 构造函数与纯虚拟析构函数

我需要建立一个类继承结构,其中抽象基类只包含成员变量(但没有成员方法)。成员方法将由派生类定义。因此,我需要的是这篇文章:Makingaclassabstractwithoutanypurevirtualmethods从前2个答案中,我意识到有两种方法可以实现它:使析构函数成为纯虚拟的。使构造函数受到保护。我很想知道这两种方法之间的区别。是否存在一种情况应该优先于另一种情况(或者可能是某些特殊情况,其中一种可以工作但另一种不行)?我想了想,也想不出什么。我在这里搜索了一些帖子的答案(Isthereauseformakingaprotecteddestructorvirtual?、C++

c++ - 无法从派生类访问基类中的 protected 成员

这是我的代码:#include#include#includeusingnamespacestd;classroot{protected:intsize;double*array;public:virtual~root(){}virtualroot*add(constroot&)=0;virtualroot*sub(constroot&)=0;virtualistream&in(istream&,root&)=0;virtualintgetSize()const=0;virtualvoidsetSize(int);};classaa:publicroot{public:aa();aa(