C++的多态包括静态多态和动态多态。静态多态包括函数重载和泛型编程,动态多态包括虚函数。静态多态是指在编译期间就能够肯定,动态多态是指在程序运行时才能肯定。编程
一、虚函数为类的非静态成员函数,访问权限通常为public。函数声明时,在返回值前加virtual关键字,函数定义时不须要加virtual。父类定义的虚函数,子类在继承时,能够对虚函数从新定义,固然子类的函数应该与父类虚函数同样,只是函数实现不同。咱们用父类的指针指向子类的实例,而后经过父类的指针能够调用实际子类的成员函数。函数
二、构造函数不能为虚函数指针
三、当基类中有虚函数的时候,通常基类的析构函数也要定义为虚析构函数。若是不定义虚析构函数,当删除一个指向派生类对象的指针时,会调用基类的析构函数,派生类的析构函数未被调用,形成内存泄漏。定义虚析构函数后,最底层的派生类的析构函数最早被调用,而后各个基类的析构函数被调用。对象
纯虚函数为虚函数在声明时,函数末尾加=0,纯虚函数没有函数定义,它的子类须要继承全部基类的纯虚函数而且给出定义。纯虚函数的做用就是为派生类提供一个一致的接口。继承
抽象类就是指含有纯虚函数的类,该类不能建立对象,可是能够声明指针和引用。接口
一、若是一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。在引用这些同名的成员时,必须在派生类对象名后增长直接基类名,以免二义性。内存
示例:编译
class A
{class
public:泛型
int m_nNum;
};
class B :public A
{…};
class C :public A
{…};
class D :public B,public C
{
};
D d1;
d1.A::m_nNum;
二、C++提供虚基类,使得在继承间接共同基类时只保留一份成员。
示例:
class A
{
public:
int m_nNum;
};
class B :virtual public A
{…};
class C :virtual public A
{…};
class D :public B,public C
{
};
D d1;
d1.m_nNum;
三、在最后的派生类中不只要负责对直接基类进行初始化,还要负责对虚基类初始化。C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其余派生类(B和C)对虚基类的构造函数的调用,保证了虚基类成员不会被屡次初始化。
例如:
class D :public B,public C
{
D(int n):A(n),B(n),C(n){ }
};
构造的顺序为先构造最上层基类,而后父类谁先继承谁先构造,析构函数的顺序和构造函数顺序相反。