纯虚函数,这真是令人难以言表啊。
纯虚函数得重新认识:a)编译器允许不实现 b) 实现了也不算错 c) 可以静态调用 d)不能多态调用
构造函数里可能依次发生的事:
基类构造函数(不管是否在初始化列表中)
设置vptr
如果类:没有在初始化列表但有默认构造函数,调用该构造函数
构造初始化列表指定的对象
这个顺序保证在构造过程中,对象先是一个根基类,然后是第二个基类,一直到当前对象自己。
基类构造函数中调用virtual函数,会执行自身的virtual函数。这是因为那面的调用顺序。
这样写有问题:
class B {
public:
B(int) {}
virtual int F() = 0;
};
class A {
public:
A() : B(F()) {
}
virtual int F() {
return 1;
}
};
按规定,F()调用应该是A::F(),但是B在构造在A的vptr设置之前。
类的成员变量或基类有析构函数时,编译器会自动合成一个析构函数。
析构函数里的调用顺序和构造函数里的正好相反。