Полиморфизм С ++ - PullRequest
       25

Полиморфизм С ++

7 голосов
/ 23 июля 2011

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

Класс B не имеет виртуальных функций, но проходит более одного теста.

Класс C имеет одну виртуальную функцию, но не наследует.

class A {};
class B : public A {};

class C
{
public:
    virtual void f () {}
};

является полиморфным классом B или C?

Ответы [ 3 ]

8 голосов
/ 23 июля 2011

2003: 10.3/1 ясно заявляет:

Класс, который объявляет или наследует виртуальную функцию, называется полиморфным классом.

Вы на самом деле сказали это, словонапример, поэтому я не совсем понимаю, в чем вопрос.

C (и его потомки, если вы добавите их) полиморфны;A и B не являются.


Обратите внимание, что в более широком смысле ООП вы всегда можете выполнить некоторый «полиморфизм», в котором C ++ всегда позволяетВы, чтобы upcast;таким образом, все объекты, которые наследуют, могут рассматриваться как разные (но связанные) типы.

Однако термин «полиморфный» определяется немного по-другому в C ++, где он имеет больше общего сможете ли вы также downcast .Если вы не хотите сбивать с толку, как в стандарте C ++, вы можете назвать это «динамическим полиморфизмом».

3 голосов
/ 23 июля 2011

Согласно стандарту, «класс, который объявляет или наследует виртуальную функцию, называется полиморфным классом».

Поскольку ни A, ни B не объявляют и не наследуют виртуальную функцию, они не являются полиморфными. C объявляет виртуальную функцию, поэтому она полиморфна.

2 голосов
/ 23 июля 2011

class C является полиморфным, что означает, что при использовании dynamic_cast или typeid на C& будет выполняться проверка типа во время выполнения, а при вызове функций-членов с помощью C& или C* будет использоваться виртуальная диспетчеризация.

(Конечно, правило «как если» позволяет компилятору избегать диспетчеризации во время выполнения при некоторых условиях, когда он заранее знает тип среды выполнения, например, когда вы только что создали объект.)


Как отметил @Bill в комментарии, это не просто то, что говорится в некоторых книгах, это определение полиморфного класса , найденного в стандарте C ++ (раздел 10.3, [class.virtual]):

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

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