2015-04-03 4 views
0

У меня есть абстрактный базовый класс. Предположим, я хочу, чтобы производный класс также был абстрактным и оставлял ответственность за реализацию чистых виртуальных функций еще более низкому классу. Каков наилучший способ сделать это?Абстрактный подкласс абстрактного базового класса

class Animal { 
public: 
    virtual void makeNoise() = 0; 
}; 

class Dog : public Animal { 
}; 

Что лучше оставить это поле пустым, как это, или я должен сделать:

class Dog : public Animal { 
public: 
    virtual void makeNoise() = 0; 

}; 

Или как об игнорировании виртуального ключевого слова и:

class Dog : public Animal { 
public: 
    void makeNoise() = 0; 
}; 

Что является наиболее подходящим способ сделать это?

+0

Является ли класс 'Собака' также абстрактным классом? –

+0

@JoachimPileborg: Да. –

+0

Кто-то сказал, что связь? –

ответ

2

Там нет функциональной разницы между различными вариантами (как вы не измените доступность), но

  • Я предпочитаю первый вариант, поскольку он позволяет избежать дублирования кода.
  • Вариант 3 является наихудшей возможностью, поскольку, хотя очевидно, что чистая виртуальная функция (обозначенная =0) является виртуальной - она ​​менее согласуется с объявлением других (чистых) виртуальных функций, введенных в Dog.
  • Я бы только вернуться к варианту 2, если

    • Dog является частью библиотеки, которую вы распространяете другой
    • Он вводит новые чистые виртуальные функции самостоятельно.
    • Animal сам по себе не должен быть дополнительно использован «типичного пользователя» непосредственно

    Таким образом, клиент, который вытекает из Dog имеет всю необходимую информацию о том какие функции он должен реализовать в одном месте.

Смежные вопросы