静态类型在编译时就已经确定了,是变量声明时的类型或表达式生成的类型。动态类型则是变量或表达式表示的内存中的对象的类型,动态类型直到运行时才知道。
例如:Quote *PQuote=new Bulk_quote,指针PQuote的静态类型为Quote,编译时已经确定,但动态类型是Bulk_quote,直到运行时才知道指向的是基类还是派生类。
若一个变量非指针也非引用。则静态类型和动态类型永远一致。
基类的指针或引用的静态类型可能与其动态类型不一致。
当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定调用哪个版本,被调用的函数是与绑定到指针或引用上的对象的动态类型相匹配的那一个。(引用或指针所绑定对象的类型)
一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型和返回类型必须与被覆盖的基类函数完全一致。
使用作用域运算符可以强迫执行虚函数的某个特定版本,而回避动态绑定。(当一个派生类的虚函数调用它覆盖的基类的虚函数版本)
含有纯虚函数的类是抽象基类,不能创建对象,不能实例化(派生类对纯虚函数进行重定义覆盖后,派生类才能够定义对象,否则仍然是抽象类)。在函数体加上“=0”就可将一个虚函数说明为纯虚函数。
派生类构造函数只初始化它的直接基类。
派生类的成员和友元可以通过派生类对象访问基类的protected成员。
private成员对于派生类来说是不可访问的。
派生类向基类的转换是否可访问由使用该转换的代码决定,同时,派生类的派生访问说明符也会有影响。
友元关系不能传递和继承。
默认情况下,使用class关键字定义的派生类是私有继承的,使用struct关键字定义的派生类是公有继承的。
使用struct和class关键字定义的类的唯一的差别是默认成员访问说明符和默认派生访问说明符。