【问题标题】: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 做练习

标签: c++ inheritance abstract multiple-inheritance


【解决方案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派生的虚拟派生类。据我所知,从基类派生的虚拟类的多个派生类有一个基类,这意味着我必须从最后一个派生类调用基类构造函数
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2010-10-26
相关资源
最近更新 更多