基类通过在其成员函数的声明语句之前加上关键字virtual是的该函数执行动态绑定。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部的声明语句而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。
静态类型与动态类型
表达式的静态类型在编译时总是已知的。它是变量声明时的类型或表达式生成的类型;动态类型则是变量或表达式表示的内存中的对象的类型。动态类型直到运行时才可知。
不存在从基类向派生类的隐式类型转换
如果再基类含有一个或多个虚函数,我们可以使用dynamic_cast请求一个类型转换,该转换的安全检查将在运行时执行。同样,如果我们已知某个基类向派生类的转换是安全的,则我们可以使用static_cast来强制覆盖掉编译器的检查工作。
在对象之间不存在类型转换
当我们给基类的构造函数传递一个派生类对象时,实际运行的构造函数时基类中定义的那个,显然该构造函数只能处理基类自己的成员。类似的,如果我们将一个派生类对象赋值给一个基类对象,则实际运行赋值运算符也是基类定义的那个,该运算符同样只能处理基类自己的成员。
含有纯虚函数的类是抽象基类
含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类。抽象基类负责定义接口,而后的其他类可以覆盖接口。我们不能(直接)创建一个抽象基类的对象。
受保护的成员
1.和私有成员类似,受保护的成员对于类的用户来说是不可访问的。
2.和公有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的。此外,protected还有另外一条重要的性质。
3.派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问特权。