virtual function specifier
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
Указывает, что функция является виртуальной
Оригинал:
Specifies that a function is virtual
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Содержание |
[править] Синтаксис
virtual function_declaration ;
|
|||||||||
[править] Объяснение
Виртуальные функции являются функциями-членами, чье поведение может быть переопределено в производных классах. В отличие от не виртуальные функции, переопределенное поведение сохраняется, даже если во время компиляции нет информации о фактическом типе класса. Это означает, что, даже если к производному классу обращаться с помощью указателя или ссылки на базовый класс, вызов переопределенной виртуальной функции выполнит поведение, определенное в производном классе.
Оригинал:
Virtual functions are member functions whose behavior can be overridden in derived classes. As opposed to non-virtual functions, the overridden behavior is preserved even if there is no compile-time information about the actual type of the class. That means, even if a derived class is handled using pointer or reference to the base class, a call to a overridden virtual function would invoke the behavior defined in the derived class.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Функция подписи должны быть одинаковыми для того, чтобы быть переопределены.
| Этот раздел не завершён Причина: handling of function signatures (member lookup rules) |
Оригинал:
The function signature must be the same in order to be overridden.
| Этот раздел не завершён Причина: handling of function signatures (member lookup rules) |
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Возвращаемый тип главной виртуальной функции не обязательно должны быть идентичны переопределить функцию. Типы могут быть различными, если они являются' ковариантный друг с другом. Два типа ковариантны, если они удовлетворяют следующим требованиям:
Оригинал:
The return type of a overriding virtual function doesn't necessarily need to be the identical to that of the overridden function. The types can be different if they are covariant with each another. Two types are covariant if they satisfy the following requirements:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
- Здесь мы ссылаемся на главной функцией, как
Derived::f()и переопределить функциюBase::f()Оригинал:Here we refer to the overriding function asDerived::f()and to the overridden function asBase::f()Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
- обоих типов указателей или ссылок на классы. Многоуровневая указатели или ссылки не допускаются.Оригинал:both types are pointers or references to classes. Multi-level pointers or references are not allowed.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - класс возвращаемого типа
Base::f()должны быть однозначными и доступными прямых или косвенных базовых классов класса типа возвращаемогоDerived::f().Оригинал:the class of the return type ofBase::f()must be a unambiguous and accessible direct or indirect base class of the class of the return type ofDerived::f().Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - возвращаемого типа
Derived::f()должны быть одинаково или меньше, чем CV-квалификацию возвращаемого типаBase::f().Оригинал:the return type ofDerived::f()must be equally or less CV-квалификацию than the return type ofBase::f().Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Если виртуальная функция вызывается непосредственно, то есть, явно квалификационный класс он является членом, то механизм вызова виртуальной подавляется, и что конкретная реализация называется.
Оригинал:
If a virtual function is called directly, that is, explicitly qualifying the class it is a member of, then the virtual call mechanism is suppressed and that particular implementation is called.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Виртуальный деструктор базового класса всегда переопределить деструктор производного класса, несмотря на то что деструкторы не наследуются иначе.
Оригинал:
A virtual destructor of a base class is always overridden by a destructor of a derived class, even though that destructors are otherwise not inherited.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Правила доступа к виртуальной функции определяются первой декларации. Доступ правилам, определенным заявлениям главной функции распространяется только на прямые вызовы функций.
Оригинал:
The access rules to a virtual function are determined by the first declaration. Access rules defined by the declarations of the overriding functions apply only to the direct function calls.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
virtual функции спецификатор предполагает членства, таким образом, единственным членом функции могут быть виртуальными. Кроме того, поскольку экземпляр класса необходима для того, чтобы вызвать виртуальную функцию, виртуальная функция не может быть static.Оригинал:
virtual function specifier implies membership, thus only member functions can be virtual. Also, since an instance of a class is needed in order to call a virtual function, virtual function can not be static.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Функции шаблоны не могут быть объявлены
virtual. Это относится только к функциям, которые сами шаблоны - регулярные функции-члена шаблона класса может быть объявлен виртуальным.Оригинал:
Functions templates cannot be declared
virtual. This applies only to functions that are themselves templates - a regular member function of a class template can be declared virtual.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Пример
Запустить этот код
class Parent { public: void functionA(); virtual void functionB(); //Note the keyword virtual void functionC(); }; class Child : public Parent { public: void functionA(); virtual void functionB(); //Note the keyword virtual }; int main() { Parent* p1 = new Parent; Parent* p2 = new Child; Child* c = new Child; p1->functionA(); //Calls Parent::functionA p1->functionB(); //Calls Parent::functionB p1->functionC(); //Calls Parent::functionC p2->functionA(); //Calls Parent::functionA because p2 points to a Parent p2->functionB(); //Calls Child::functionB even though p2 points // to a Parent because functionB is virtual p2->functionC(); //Calls Parent::functionC c->functionA(); //Calls Child::functionA c->functionB(); //Calls Child::functionB c->functionC(); //Calls Parent::functionC return 0; }
[править] См. также
- спецификатор переопределения (начиная с C++11)
- Окончательный спецификатор (начиная с C++11)

