基类通常应该定义一个虚析构函数;
基类用virtual关键字声明的虚函数可以在派生类中重新定义,在派生类中重新定义时最好也加上virtual关键字
通过指针或引用调用的虚函数在运行时才会被解析,其他函数在编译时就会被解析。
动态绑定(多态):
用一个基类的引用(或指针)调用一个虚函数时,传入不同的派生类或者基类将调用不同的函数实现。
基类引用可以指向派生类是因为派生类含有基类的部分,编译器 会隐式转换。
class A
{
protected:
int a, b;
};
class AA: public A
{
protected:
int c;
};
基类构造函数:
A(int _a, int _b):a(_a),b(_b) {}
派生类构造函数:
AA(const AA& myAA):A(myAA), c(myAA.c){}
派生类赋值运算符重载:先调用基类的赋值运算符
AA& operator=(const AA& myAA)
{
A::operator=(myAA);
c=myAA.c;
}
派生类到基类的转换只对引用和指针类型有效,派生类和基类不能直接转换,但是基类的拷贝构造函数和赋值操作符要传一个基类的常引用,所以可以传派生类。
构造析构顺序:
构造时:先构造基类成员,再构造派生类成员
析构时:先析构派生类成员,再析构基类成员