Лучшая практика при работе с наследованием C ++ - PullRequest
0 голосов
/ 13 июня 2018

Я хотел бы знать в приведенном ниже сценарии, какая практика будет правильной / идеальной, и если у меня есть какие-то другие варианты.

Предположим, у меня есть класс, унаследованный от другого класса.

class A { };

class B : public A { };

class C : public A { };

Я веду карту указателей A (базовый класс).На самом деле это либо производный класс B, либо класс C.

Теперь, скажем, я хотел бы выполнить операцию x с одним из указателей производного класса на карте.Я вижу, что есть два способа сделать это.

1] Введите базовый класс в класс dervied и выполните операцию над ним.Это хорошая практика?

2] Имейте виртуальную функцию, доступную в базовом классе, чтобы вы могли выполнять операцию без приведения типов.Я чувствую, что проблема в том, что некоторые методы действительно могут принадлежать производному классу, а не базовому классу.Я имею в виду, что один метод, применимый к производному классу B, может быть неприменим к производному классу C. Мне неудобно иметь чисто виртуальную функцию на A. Имею ли чисто виртуальную функцию, это хорошая практика?В качестве альтернативы, что можно сделать?

1 Ответ

0 голосов
/ 13 июня 2018

Виртуальные функции были специально разработаны для работы через указатели на базовый класс с объектами на основе или производных.Таким образом, вы получите полиморфизм времени выполнения, если все ваши классы поддерживают операцию x ().

Однако, если, скажем, только C поддерживает x (), какое поведение вы хотите для указателей на объекты A и B?Может быть просто хранить ряд указателей на C отдельно?В этом случае вам не нужно наследование.

Либо вы можете указать некоторую пустую реализацию для x () в классе A - которая может быть абстрактной, если вам не нужны объекты класса A. Это обычная практика.

Приведение во время выполнения связано с затратами времени, а также с проверкой if, которая приводит к снижению производительности.

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