virtual function specifier

来自cppreference.com
< cpp‎ | language

 
 
C++ 语言
表达式
替代表示
字面量
布尔 - 整数 - 浮点
字符 - 字符串 - nullptr (C++11)
用户定义 (C++11)
工具设施
特性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
强制转换
隐式类型转换 - 显式类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
虚函数
override 说明符 (C++11)
final 说明符 (C++11)
特殊成员函数
模板
杂项
 
指定一个函数是虚拟的
原文:
Specifies that a function is virtual
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

目录

[编辑] 语法

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.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
以被覆盖的函数签名必须是相同的。
原文:
The function signature must be the same in order to be overridden.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
一个压倒一切的虚函数的返回类型,并不一定需要是相同的覆盖功能。类型可以是不同的,如果他们是“协变”与彼此。两种类型是协变的,如果他们满足下列要求:
原文:
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:
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
在这里,我们所说的最重要的功能Derived::f()和重写功能Base::f()
原文:
Here we refer to the overriding function as Derived::f() and to the overridden function as Base::f()
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
  • 这两种类型的指针或引用的类。不允许多层次的指针或引用.
    原文:
    both types are pointers or references to classes. Multi-level pointers or references are not allowed.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • Base::f()的返回类型之类的必须是明确的和可访问的直接或间接基类的类的返回类型Derived::f().
    原文:
    the class of the return type of Base::f() must be a unambiguous and accessible direct or indirect base class of the class of the return type of Derived::f().
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • Derived::f()的返回类型是同样或更少的返回类型CV-资格Base::f()比.
    原文:
    the return type of Derived::f() must be equally or less CV-资格 than the return type of Base::f().
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
如果直接调用虚函数,也就是说,明确​​限定类中的一员,那么虚拟调用机制被抑制,特别是实施被称为.
原文:
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.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
虚析构函数总是覆盖的基类的派生类的析构函数,析构函数,否则即使不继承.
原文:
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.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
访问规则是由一个虚函数的第一个声明。的声明最重要的功能定义的访问规则只适用于直接的函数调用.
原文:
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.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
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.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
函数模板不能宣布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.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 示例

class 父类 {
public:
    void 甲函数();
    virtual void 乙函数();   //注意关键词 virtual(虚拟)
    void 丙函数();
};
 
class 子类 : public 父类 {
public:
    void 甲函数();
    virtual void 乙函数();   //注意关键词 virtual(虚拟)
};
 
int main()
{
    父类*1 = new 父类;
    父类*2 = new 子类;
    子类*= new 子类;
 
    父1->甲函数();   //调用 父类::甲函数1->乙函数();   //调用 父类::乙函数1->丙函数();   //调用 父类::丙函数
 
    父2->甲函数();   //调用 父类::甲函数 因为父2指向一个父类2->乙函数();   //调用 子类::乙函数 尽管父2指向 
                       // 一个父类 因为甲函数是虚拟的2->丙函数();   //调用 父类::丙函数
 
    子->甲函数();   //调用 子类::甲函数->乙函数();   //调用 子类::乙函数->丙函数();   //调用 父类::丙函数
 
    return 0;
}


[编辑] 另请参阅