Частное наследование: как сделать объект базового класса (который имеет чисто виртуальные методы)? - PullRequest
1 голос
/ 22 июня 2011

Рассмотрим следующий код:

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 ++ позволяет мне получить доступ к методу methodDefinedInBase () из someMethod () класса Derived. Но как мне создать объект типа «База»?

Спасибо

Вишну.

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Как отмечает Бета в комментарии, вы не можете создать экземпляр абстрактного базового класса (класса с чисто виртуальными методами). Вы можете создавать экземпляры только производных классов, которые реализуют эти чисто виртуальные методы.Это верно независимо от того, используете ли вы публичное или частное наследование.

1 голос
/ 22 июня 2011

Вы не создаете никаких объектов типа "Base" - предоставляя Base чисто виртуальный член, вы прямо заявляете, что этот класс не может существовать сам по себе, но только через производные классы. То, что вы хотите создать, это указатели или ссылки на базу:

Derived1 x;
Derived2 y;

// Somewhere inside Derived1:
Base & rb = x;

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

Тогда вы можете использовать полиморфизм, обрабатывая rb и pb равномерно, без необходимости знать конкретный тип x и y.

0 голосов
/ 04 апреля 2013

Объявление чистой виртуальной функции в базовом классе означает: 1. Объект такого класса не может быть создан. 2. Для создания объекта производного класса должны быть определены все чисто виртуальные функции. Другими словами, чисто виртуальный метод не позволяет создавать объекты класса, в котором они определены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...