Вызов методов подкласса - PullRequest
       7

Вызов методов подкласса

1 голос
/ 01 февраля 2011

У меня есть классы Foo и Bar, где Бар наследует от Foo.Оба класса имеют метод getLength().В моем main есть функция, которая принимает объект суперкласса Foo в качестве параметра, но ему часто передается объект Bar.

Когда передается объект Bar, почему он по-прежнему вызывает метод Foo getLength()?

Ответы [ 8 ]

3 голосов
/ 01 февраля 2011

Вы должны определить свой метод как virtual, если дочерний класс может переопределить его.

3 голосов
/ 01 февраля 2011

Извините, если это глупый вопрос, но вы пометили обе функции getLength () как "виртуальные"?(Вам нужно.)

2 голосов
/ 01 февраля 2011

Вам необходимо объявить метод virtual в базовом классе.

Помните, что классы с любыми виртуальными методами также должны иметь виртуальный деструктор.

Много информации здесь: http://www.parashift.com/c++-faq-lite/virtual-functions.html

1 голос
/ 01 февраля 2011

Все правы, конечно, в том, что вам нужно пометить функцию как виртуальную.Но почему это так?

В C ++ вызовы не виртуальных функций разрешаются во время компиляции с использованием типа ссылки , а не фактического типа объекта.Вот почему в вашем случае вызывается функция Foo :: getLength () - ваша функция объявляется для использования Foo.

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

Прочитайте раздел виртуальных функций в C ++ FAQ для всех подробностей.

(Сравните этот сценарий с языком, подобным Java, гдеМетоды экземпляра по умолчанию являются виртуальными.)

1 голос
/ 01 февраля 2011

Вам необходимо объявить метод как virtual .

    class Foo
    {
       virtual double getLength();
    }
0 голосов
/ 01 февраля 2011

«виртуальное» ключевое слово требуется в объявлении getLength ().И помните, чтобы создать виртуальный деструктор в каждом классе, чтобы правильно освободить ресурсы.Потому что если вы используете указатель на базовый класс, который указывает на производный и вызывает не виртуальный деструктор, будет вызван только деструктор базового класса.Если вы добавите виртуальный деструктор, то сначала будет вызван деструктор производного класса, а после него деструктор базового класса.Это полезно, когда вы получаете дополнительные ресурсы в производном классе и должны сначала его освободить.И деструктор базового класса не может сделать это, потому что он не знал о дополнительных ресурсах.

0 голосов
/ 01 февраля 2011

И, конечно же, есть вопрос об одном интервью: один объявлен как const, а другой нет!

0 голосов
/ 01 февраля 2011

Вы должны объявить функцию getLength () Foo как виртуальную.Пожалуйста, перейдите по ссылке ниже для объяснения виртуальных функций, скрытия виртуализации, виртуальных таблиц и т. Д. [http://www.learncpp.com/cpp-tutorial/122-virtual-functions/]

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