缺省参数静态绑定,而虚函数动态动态绑定,注意
在析构函数中,先是对子类进行析构,再对父类进行析构。
两个阶段中,整个类被分别视做子类和父类来处理。
此时,两个阶段中调用的虚函数都是个自类里定义的函数,所以虚函数的动态绑定机制是不起作用的。
虚函数一定得有this指针,所以类中的static函数不能是虚函数(static函数没有this指针)
纯虚函数:virtual void f() = 0;这种后面有=0的虚函数
抽象类:含有纯虚函数的类,抽象类不能实例化
接口:属于抽象类
sizeof(空类)为1字节
多继承:class C : A, B,菱形继承时(class D : B, C,class B : A,class C : A)最好用vitual继承(class D : virtual B, virtual C)
多重继承:class C : B,class B : A
class A {
virtual void f() {}
int a;
};
则sizeof(A)=8,前四字节为第一个虚函数入口,后四字节为int a
class A {
public:
virtual void f() {}
};
class B {
public:
virtual void f() {}
};
class C : public A, public B {
virtual void f() {}
};
C c;则c中具有两个虚指针(A的和B的)。
虚函数表:
C c; 则C有两个虚函数表,一个对应A,一个对应B,A和B表中的虚函数会被C的虚函数覆盖中,C的实例c有两个vfptr,一个指向C中的A虚函数表,一个指向B虚函数表。
如果一个类中有虚函数,那么它有多少个父类就有多少个虚函数表和多少个vfptr。
B& b = (B&)c; 则b.f()是调用c的虚函数。