编程语言
首页 > 编程语言> > c++的多态性

c++的多态性

作者:互联网

  1. 静态联编

静态联编所支持的多态性称为编译时的多态性,例如重载函数就是静态联编的例子之一,它是在编译时选择相应的函数运行,根据类型匹配函数重载和运算符重载,与动态联编不同.

  1. 动态联编

动态联编是在程序运行时进行的联编,根据实际对象调用相应函数,虚函数就是动态联编的基础.

虚函数

虚函数的关键字是virtual,例如:

virtual<返回值类型><函数名>(<形式参数表>)

{

<函数体>

}

在类中,基类中说明的虚函数具有子自动向下传给他派生类的性质,也就是说,基类虚函数可以继承给他的子类,虚函数与重载函数的区别就是,它所用的类型和函数形参需要一致,为了区别虚函数和重载函数,把在派生类中重定义的基类虚函数称为覆盖,我们也可以叫它重写.

  1. 纯虚函数和抽象类

(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