博客
关于我
(c++)第五章多态性和虚函数
阅读量:722 次
发布时间:2019-03-21

本文共 2419 字,大约阅读时间需要 8 分钟。

5.1 静态联编与动态联编

在编程中,多态性是指同一符号或名字在不同情境下具有不同实现的现象。在C++中,有两种多态性:编译时的多态性和运行时的多态性。函数联编是指在函数调用时,根据具体情况选择适当的函数体进行链接。C++支持两种联编方式:静态联编和动态联编。

静态联编(早期联编)

静态联编是在程序编译阶段完成的。其特点是速度快,但缺乏灵活性。编译时的多态性也称为静态多态性。以下示例展示了静态联编的工作原理:

#include 
const double PI = 3.14;using namespace std;class Figure { public: Figure() {} double area() const { return 0.0; }};class Circle : public Figure { public: Circle(double myr) { R = myr; } double area() const { return PI * R * R; } protected: double R;};class Rectangle : public Figure { public: Rectangle(double myl, double myw) { L = myl; W = myw; } double area() const { return L * W; } private: double L, W;};int main() { Figure fig; double area; area = fig.area(); cout << "Area of figure is " << area << endl;}

运行结果:

Area of figure is 0Area of circle is 28.26Area of rectangle is 20

静态联编的优点是运行速度快。根据对象赋值兼容原则,基类对象可以与派生类对象兼容,基类指针可以指向派生类对象,基类引用也可以引用派生类对象。

动态联编(晚期联编)

动态联编发生在程序运行时,适用于函数的多态性。动态联编需要满足三个条件:类型兼容原则、声明虚函数以及通过指针、引用或函数调用访问虚函数。

虚函数

虚函数是动态联编的基础。虚函数在基类中声明,并可由派生类重新定义。虚函数需要满足以下条件:

  • 基类中的虚函数具有自动传递虚特性向下。
  • 派生类可通过覆盖基类虚函数来实现动态联编。

以下示例展示了虚函数的使用:

#include 
using namespace std;class Base { public: virtual ~Base() {}};class Subclass : public Base { public: Subclass() {} ~Subclass() {}};int main() { Subclass sc; cout << "对象创建成功" << endl;}

运行结果:

对象创建成功

虚函数与一般函数重载的区别

虚函数与一般函数重载有以下区别:

  • 函数名和签名需完全一致。
  • 仅限成员函数,且为非静态成员函数。

继承虚属性向下

基类中的虚函数自动传给派生类,其虚特性保持不变。派生类可通过覆盖基类虚函数来维持多态性。

以下示例展示了不恰当虚函数的错误:

class Base {    public:    virtual int func(int x) {        cout << "This is Base class";        return x;    }};class Subclass : public Base {    public:    virtual int func(float x) {        cout << "This is Sub class";        return x;    }};运行结果:

This is Base classx=5This is Sub classx=5

以下示例展示了不正确覆盖虚函数的错误:```cppclass Subclass : public Base {    public:    virtual int func(int x) {        cout << "This is Sub class";        return x;    }}int main() {    Base bp;    cout << bp.func(5) << endl;}

运行结果:

0

成员函数中调用虚函数

成员函数可直接调用类等级中的虚函数:

class Base {    public:    virtual void func1() {        cout << "This is Base class func1()" << endl;    }};class Subclass : public Base {    public:    virtual void func1() {        cout << "This is Sub class func1()" << endl;    }};int main() {    Subclass sc;    sc.func1();}

运行结果:

This is Sub class func1()

在满足公有继承关系的情况下,成员函数中调用虚函数将采用动态联编。

转载地址:http://abirz.baihongyu.com/

你可能感兴趣的文章
Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
查看>>
python4.0 gil_Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
查看>>
python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
查看>>
Python: AES加密与解密
查看>>
Python: Range() 最大尺寸;动态的还是静态的?
查看>>
Python: Windows下用 multiprocessing 的深坑
查看>>
python:Could not find platform independent libraries <prefix>解决方法
查看>>
Python:datetime tzinfo 时区名称文档
查看>>
Python:deepcopy(list) vs new_list = old_list[:]
查看>>
Python:Google API - 从消息中获取 mimeTypes
查看>>
Python:Google API - 从消息中获取 mimeTypes
查看>>
Python:subprocess.call,stdout to file,stderr to file,在屏幕上实时显示stderr
查看>>
Python:TypeError:无法连接“str“和“int“对象
查看>>
Python:XPath 在 ElementTree 中不可用
查看>>
Python:从 FTP 服务器下载文件
查看>>
python:从列表中创建元组列表
查看>>
Python:从嵌套列表中删除重复项
查看>>
Python:从间隔映射到值
查看>>
Python:使用 shell=False 的子进程调用不起作用
查看>>
Python:修改 PATH 环境变量的平台无关方式
查看>>