c++的多态性
作者:互联网
- 静态联编
静态联编所支持的多态性称为编译时的多态性,例如重载函数就是静态联编的例子之一,它是在编译时选择相应的函数运行,根据类型匹配函数重载和运算符重载,与动态联编不同.
- 动态联编
动态联编是在程序运行时进行的联编,根据实际对象调用相应函数,虚函数就是动态联编的基础.
虚函数
虚函数的关键字是virtual,例如:
virtual<返回值类型><函数名>(<形式参数表>)
{
<函数体>
}
在类中,基类中说明的虚函数具有子自动向下传给他派生类的性质,也就是说,基类虚函数可以继承给他的子类,虚函数与重载函数的区别就是,它所用的类型和函数形参需要一致,为了区别虚函数和重载函数,把在派生类中重定义的基类虚函数称为覆盖,我们也可以叫它重写.
- 纯虚函数和抽象类
(1) 纯虚函
如果在基类中不能给出有意义的虚函数的实现,但又必须让基类为派生类提供一个公共界面函数,这时就可以将它说明为纯虚函数.
我们可以这么定义:
virtual<返回值类型><函数名>(<形式参数表>)=0;
//这种只是表示虚函数的一种形式,并不是说明它的返回值为0;
(2) 抽象类
一个类中可以说明多个纯虚函数,含有纯虚函数的类被称为抽象类.从一个抽象类派生的类必须覆盖纯虚函数,或者在派生类中仍然定义它为纯虚函数,比如程序将会报错.
在成员函数内可以调用纯虚函数,但在构造函数和析构函数中调用会导致程序报错,因为没有纯虚函数的定义代码.
例:
class va
{
public:
virtual void fun=0;
void fun2(){fun1();} //正确
va(){fun(1);} //错误
};
(3) 虚析构函数
一个类中将成员设置为虚函数,他只是增加一些资源开销,并没有其他坏处.析构函数也可以是虚函数,并且在动态联编时,最好将虚构函数设置为虚函数.因为析构没有参数,所以一个类中只能有一个虚析构函数.
我们写个简单程序分析一下:
# include < iostream>
using namespace std;
class Base
{
public:
Base(){}
virtual~Base(){cout<<"Basedestructor is called."<<endl;}
};
class Subclass : public Base
{
public:
Subclas(){}
~Subclass();
Subclass:: ~ Subclass()
{
cout<<”Subclass destructor is called.”<<endl;
}
int main()
{
Base * b= new Subclass;
delete b;
return 0;
}
这个程序输出的结果为:
Subclass destructor is called.
Base destructor is called.
该程序中基类的析构函数由派生类的析构函数调用,如果析构函数不是虚函数,则语句delete b;将根据base类的析构函数运行.
标签:Subclass,函数,联编,多态性,c++,Base,纯虚,基类 来源: https://www.cnblogs.com/zxy20020103/p/14723805.html