• 2024 年 12 月 23 日

C++入门学习笔记4:多态

类的多态就是指多种形态,在接触多态前,我们先来认识一下虚函数。

虚函数

  • 在类的定义中,前面带有virtual关键字的成员函数就是虚函数
  • virtual只写在类定义的函数声明中,写函数体时不用。
    注意构造函数静态成员函数不能是虚函数。
class base{
    public:
        virtual int get();
        ...
    ...
};
int base::get(){
//函数体
};

虚函数与普通成员函数的区别就在于虚函数可以参与多态而普通的成员函数不能

多态的表现形式

表现形式一

派生类的指针可以赋值给基类指针。

如果,通过基类指针调用基类和派生类的同名虚函数,那么会出现以下两种情况:

  • 指针指向基类的对象,则被调用的是基类的虚函数
  • 指针指向派生类的对象,则被调用的是派生类的虚函数。 这中机制就是多态。 示例:
#include <iostream>
using namespace std;

class CBase{
    public:
    virtual void SomeVirtualFunction(){
        cout<<"CBase"<<endl;
    }

};

class CDerived:public CBase{
    public:
    virtual void SomeVirtualFunction(){
        cout<<"CDerived"<<endl;
    }

};

int main(){
    CDerived ODerived;
    CBase *p=&ODerived;
    p->SomeVirtualFunction();    //调用哪个虚函数取决于p指向哪种类型的对象
    return 0;
}

debug后输出结果为:

CDerived

从上述程序中我们可以发现,在语句CBase *p=&ODerived;执行时,指针p指向派生类CDerived的对象ODerived,因此,调用的是ODerived中的虚函数SomeVirtualFunction

表现形式二

派生类的对象可以赋值给基类的引用。

如果,通过基类引用调用基类和派生类的同名虚函数,那么会出现以下两种情况:

  • 引用引用的是基类的对象,则被调用的是基类的虚函数
  • 引用引用的是派生类的对象,则被调用的是派生类的虚函数

这中机制也称为多态。

示例:

#include <iostream>
using namespace std;

class CBase{
    public:
    virtual void SomeVirtualFunction(){
        cout<<"CBase"<<endl;
    }

};

class CDerived:public CBase{
    public:
    virtual void SomeVirtualFunction(){
        cout<<"CDerived"<<endl;
    }

};

int main(){
    CDerived ODerived;
    CBase & r =ODerived;
    r.SomeVirtualFunction();
    return 0;
}

debug后程序运行结果为:

CDerived

我们通过解析上面的程序很容易发现,基类CBase引用了派生类CDerived的对象ODerived,因此调用的是ODerived中的虚函数SomeVirtualFunction

多态的作用

多态是面向对象语言的一个重要的性质,可以增强程序的可扩充性,即程序修改或增加功能时,减少代码修改量。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注