У меня есть вопрос, вот два класса ниже:
class Base{
public:
virtual void toString(); // generic implementation
}
class Derive : public Base{
public:
( virtual ) void toString(); // specific implementation
}
Вопрос:
Если я хочу подкласс класса, Происходят, выполняют polymophism использование указателя Основы типа, действительно ли ключевое слово является виртуальным в необходимой скобке?
Если ответ не, каково различие между функцией членства toString класса, Происходят с и без виртуального?
C ++ 03 §10.3 / 2:
Если виртуальная функция-член vf объявлена в классе Base и в классе Derived, производном напрямую или косвенно из Base, член {{ 1}} функция vf с тем же именем и тем же списком параметров, что и Base :: vf, объявлена , тогда Derived :: vf также является виртуальным (независимо от того, не так объявлено) и переопределяет Base :: vf.
Компилятор уже знает из ключевого слова virtual в базовом классе, что toString является виртуальным методом. Не нужно повторять это.
Функция однажды виртуальная всегда виртуальная .
Таким образом, в любом случае, если ключевое слово virtual не используется в последующих классах, это не мешает функции / методу быть «виртуальными», т.е. быть переопределенными. Таким образом, следующее руководство может помочь с точки зрения командной разработки: -
/ * virtual * / void someFunc ();
Это вопрос хорошего стиля, и пользователь-программист знает, что происходит. В C ++ 0x вы можете использовать [[override]], чтобы сделать его более явным и видимым. Вы можете использовать [[base_check]], чтобы принудительно использовать [[override]].
Если вы не хотите или не можете этого сделать, просто используйте ключевое слово virtual.
Если вы производите наследование без виртуального toString и приводите экземпляр Derive обратно к Base, вызов toString () фактически вызовет метод Base toString (), поскольку, насколько ему известно, это экземпляр Base.
Для компилятора не имеет значения, указываете ли вы ключевое слово virtual в производных версиях функция.
Тем не менее, это хорошая идея в любом случае предоставить ее, чтобы любой, кто посмотрел на ваш код, мог сказать, что это виртуальная функция.
Это ключевое слово является необязательным и не имеет никакого значения.
Свойство виртуальное
унаследовано от базового класса и предполагается, что оно присутствует, даже если вы не вводите его.