вопросы наследования cpp - PullRequest
       21

вопросы наследования cpp

2 голосов
/ 22 августа 2011

Какая еще причина, кроме наследования, должна иметь класс, чтобы его функции были виртуальными?

Что происходит во время выполнения, когда базовый класс наследуется, а производный класс не реализует немногие функции базового класса, а третий класс вызывает неопределенные методы, которые определены как виртуальные в базе. Ошибка seg или это вызовет функцию базового класса?

Что мне делать, если я не хочу определять все функции в моем базовом классе на своем производном классе, но все еще имею необходимое наследование?

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Какая другая причина помимо наследования должна быть у класса его функции как виртуальные?

Нет разумного использования функции virtual, если вы не имеете дела с наследованием. Оба предназначены друг для друга.

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

Если производный класс вообще не делает никаких заявлений о функции virtual в ее теле, то (непосредственные) функции базового класса virtual вызываются с объектом производного класса. С другой стороны, если вы просто объявляете функцию virtual в производном классе, но не определяете ее, то это ошибка компоновщика. Нет ошибки сегментации.

Что мне делать, если я не хочу определять все функции в моем базовый класс на моем производном классе, но все еще есть необходимые наследство на месте?

Хотя это неясно, я бы сказал, вы просто не объявляете / не определяете virtual функцию (которую вы не хотите) в производном классе. Он будет использовать функции базового класса virtual.

0 голосов
/ 22 августа 2011

Если вы не переопределите метод virtual, вызывающий вызов вызовет базовый класс.Это своего рода смысл использования наследования, IMO.

Если вы не хотите, чтобы базовый класс реализовывал виртуальный метод, вы можете объявить его следующим образом:

class Demo {
    void foo() = 0;
};

Эточто называется абстрактным классом. Обратите внимание, что вы не можете создать экземпляр такого класса .Любой класс, который наследуется от Demo, должен реализовывать foo(), иначе он также будет абстрактным классом и, следовательно, не подлежит проверке.

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