1). 函数重载和运算符重载这两种多态性,在编译时就能确定的,叫做静态连编
2). 像虚函数,根据运行时的对象不同,而显示不同的效果,叫做动态连编
2. 虚函数,若基类中有虚函数,则其析构函数也应声明为虚函数,子类的析构函数会默认成为虚析构函数
测试代码:
#include
using namespace std;
class A
{
public:
A()
{
cout<<"A"<
virtual ~A() // 如果这里没有声明为虚函数,那么delete a, 只会释放a, 而不是释放new B的空间。
{
cout<<"A destroy "<
};
class B:public A
{
public:
B()
{
cout<<"B"<
~B()
{
cout<<"B destroy "<
};
int main()
{
A *a = new B;
delete a;
return 0;
}
注:为了在撤销动态分配存间时,能得到正确的处理,必须将基类析构函数设置为虚析构函数。
在以后编程中,即使基类并不需要析构函数,也要显示地定义一个函数体为空的虚析构函数,
那么后面派生类的析构函数就都成为虚析构函数了,这是一个重要的技巧。
3. 纯虚函数
格式: virtual 类型 函数名(参数表)=0;
可见,函数体本身并没有内容,只起到了一个统一接口的作用
4. 抽象类
含有纯虚函数的类,叫做抽象类,不能实例化,不能声明抽象类的对象,
但是可以声明抽象类指针和抽象类别名。
注:子类必须实现抽象类中的同名方法(不受权限限制),当然,也可继续声明为纯虚函数
测试代码:
#include
using namespace std;
class A // 抽象类
{
public:
virtual void show()=0;
};
class B:public A
{
private:
void show() // 重写纯虚函数,不受权限的限制
{
cout<<"B show()"<
};
int main()
{
A *a = new B;
a->show(); // 因为基类是public的,所以不受限制,到子类中寻找函数的定义
return 0;
}