抽象基类、私有继承和多重公有继承
Posted
技术标签:
【中文标题】抽象基类、私有继承和多重公有继承【英文标题】:Abstract Base Class, private inheritance and multiple public inheritance 【发布时间】:2015-05-19 11:37:43 【问题描述】:我有问题或误解。这里我有一些 ABC(Person
)还有两个私有派生的虚拟类(PokerPlayer
和 Gunslinger
)。在我必须声明一个派生自(PokerPlayer
和Gunslinger
)的公共类(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派生的虚拟派生类。据我所知,从基类派生的虚拟类的多个派生类有一个基类,这意味着我必须从最后一个派生类调用基类构造函数以上是关于抽象基类、私有继承和多重公有继承的主要内容,如果未能解决你的问题,请参考以下文章