【问题标题】:Private Inheritance: How do I make object of the Base Class ( which has got pure virtual methods)?私有继承:如何创建基类的对象(具有纯虚方法)?
【发布时间】:2011-06-21 22:26:48
【问题描述】:

考虑以下代码:

class Base
{
  protected:
  virtual void methodDefinedInBase() = 0;
}

Class Derived: private Base
{
  public:
  void someMethod();
  protected:
  virtual void methodDefinedInBase()
  {
    std::cout<<"From B"<<std::endl;
  }
}

在上面的代码中,我可以创建“派生”类型的对象。 C++ 允许我从派生类中的“someMethod()”访问方法“methodDefinedInBase()”。但是,如何创建“Base”类型的对象?

谢谢,

毗湿奴。

【问题讨论】:

  • 你不能。为什么要这样做?
  • base 中的 methodDefinedInBase 究竟是如何“定义”的?它只在那里声明。
  • 我试图使用私有继承来实现组合。我的自然冲动是创建一个“Base”对象并将其添加到“Derived”类中。但是,我辜负了自己的目的。实现私有继承将强制执行组合。 :)

标签: c++ pure-virtual virtual-functions private-inheritance


【解决方案1】:

正如 Beta 在评论中指出的那样,您不能实例化抽象基类(具有纯虚拟方法的类)。您只能实例化实现这些纯虚拟方法的派生类。无论您使用的是公共继承还是私有继承,这都是正确的。

【讨论】:

    【解决方案2】:

    您不会创建任何“Base”类型的对象——通过给 Base 一个纯虚拟成员,您明确表示该类不能单独存在,而只能通过派生类存在。您想要创建的是 pointers 或 references 到 Base:

    Derived1 x;
    Derived2 y;
    
    // Somewhere inside Derived1:
    Base & rb = x;
    
    // Somewhere inside Derived2:
    Base * pb = &y;
    

    那么你可以通过统一处理rb和pb来使用多态性,而不需要知道x和y的具体类型。

    【讨论】:

    • 我拒绝编辑您的答案,将const 添加到rb 和pb 的声明中:-) 但是,是的,很好的例子。
    • @Dan:为什么是 const?难道我不能使用非常量虚方法,还是没有意义?
    • 除了 OP 是从Base 私下继承的,所以他不能在Base&amp; 中持有对Derived 的引用
    • @Lambdageek:啊,很有趣。我从来没有意识到,我认为私有继承只是使基类的所有成员在派生类中都是私有的。那么我该怎么做呢?甚至“const Base & rb = x;”给我一个“无法访问的基础”错误。
    • @Dan:哦,我明白了。私有继承将多态性限制在派生类中。好的。我和你一样希望“尽可能使用 const,必要时使用非 const”,我只是不想掩盖这个例子......
    【解决方案3】:

    在基类中声明纯虚函数意味着: 1. 该类的对象不能被实例化。 2. 要实例化派生类的对象,必须定义所有纯虚函数。换句话说,纯虚方法不允许您创建定义的类的对象。

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多