抽象基类、私有继承和多重公有继承

Posted

技术标签:

【中文标题】抽象基类、私有继承和多重公有继承【英文标题】:Abstract Base Class, private inheritance and multiple public inheritance 【发布时间】:2015-05-19 11:37:43 【问题描述】:

我有问题或误解。这里我有一些 ABC(Person)还有两个私有派生的虚拟类(PokerPlayerGunslinger)。在我必须声明一个派生自(PokerPlayerGunslinger)的公共类(BadDude)之前,这部分一切都很完美。问题是=>。

1)

 BadDude::BadDude(const BadDude & obj) 
: Person::Person(obj) /*<- the problem*/, PokerPlayer(obj) , Gunslinger(obj) 

2) operator=(); 也会发生这种情况。

BadDude & BadDude::operator=(const BadDude & obj)

    if (this == & obj)
        return *this;

    Person::operator=(obj); //dose not work
    PokerPlayer::oprtr(obj);
    Gunslinger::oprtr(obj);

    return *this;

3) 我无法通过 BadDude 的方法访问受保护的 ABC 方法

void BadDude::Show()const

    Person::Data(); //the same problem
    Gunslinger::Data();
    PokerPlayer::Data();

这就是工作室对问题 #1 所说的

error C2436: 'ctor' : member function or nested class in constructor initializer list

这就是工作室对问题 #2 所说的

 error C2249: 'Person::operator =' 
: no accessible path to private member declared in virtual base 'Gunslinger'

这就是工作室对问题 #3 所说的

error C2249: 'Person::Data' : no accessible path to private member declared in virtual base 'Gunslinger'

这里是代码enter link description here

【问题讨论】:

1) 你的 BadDude 构造函数中有额外的 Person:: 为什么(虚拟)从Person私下继承? @MikhailGritsenko 只有一个Person:: - 你不能错过它。 好吧,如果公开一切都会正常工作。但我必须用私有继承来解决这个问题。我正在从 Prata c++ 11 做练习 【参考方案1】:

对于问题1:有多余的Person::,应该是

BadDude::BadDude(const BadDude & obj) : Person(obj), PokerPlayer(obj) , Gunslinger(obj) 

对于可访问性问题,使用受保护(或公共)继承:

class Gunslinger : virtual protected Person
 /*...*/ ;
class PokerPlayer : virtual protected Person
 /*...*/ ;

【讨论】:

派生类有一个基类(Person)和两个从Person派生的虚拟派生类。据我所知,从基类派生的虚拟类的多个派生类有一个基类,这意味着我必须从最后一个派生类调用基类构造函数

以上是关于抽象基类、私有继承和多重公有继承的主要内容,如果未能解决你的问题,请参考以下文章

C++继承:公有,私有,保护

C++_练习—继承_公有继承

继承和多态

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结

多继承 与 多重继承

类的继承