ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++的多态性

2021-05-01 09:34:52  阅读:247  来源: 互联网

标签:Subclass 函数 联编 多态性 c++ Base 纯虚 基类


  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有