Передача аргументов через абстрактный класс конструктору класса прародителя - PullRequest
1 голос
/ 28 февраля 2012

У меня есть класс Grandparent, который предоставляется библиотекой. Я хотел бы определить интерфейс для подклассов Grandparent, поэтому я создал абстрактный подкласс с именем Parent:

class Grandparent {
    public:
        Grandparent(const char*, const char*);
};

class Parent : public Grandparent {
    public:
        virtual int DoSomething() = 0;
};

Конструктор для Grandparent принимает два аргумента. Мне бы хотелось, чтобы мой дочерний класс Child также имел конструктор с двумя аргументами и просто передавал их конструктору для Grandparent… что-то вроде

class Child : public Parent {
    public:
        Child(const char *string1, const char *string2)
        : Grandparent(string1, string2)
        {}

        virtual int DoSomething() { return 5; }
};

Конечно, конструктор Child не может вызвать конструктор класса своего прародителя, только конструктор его родительского класса. Но так как Parent не может иметь конструктора, как я могу передать эти значения конструктору дедушки?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Parent, безусловно, может иметь конструктор.Это должно произойти, если он собирается вызывать конструктор Grandparent с любыми параметрами.

Нет ничего, запрещающего абстрактным классам иметь конструкторы, деструкторы или любые другие виды функций-членов.Он может даже иметь переменные-члены.

Просто добавьте конструктор в ParentChild вы вызовете конструктор Parent;Вы не можете "пропустить поколение" с помощью вызовов конструктора.

class Parent: public Grandparent
{
public:
  Parent(char const* string1, char const* string2):
    Grandparent(string1, string2)
  { }
  virtual int DoSomething() = 0;
};
2 голосов
/ 28 февраля 2012

Если вы хотите что-то еще, кроме конструктора по умолчанию для Parent, вам нужно его предоставить.

Проверьте этот вопрос о наследовании конструкторов

Также смотрите это пример абстрактного класса

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