C++学习笔记23:虚函数和多态

虚函数

    1 虚函数定义:在类的定义中,前面有virtual关键字的成员函数就是虚函数。
        class base
        {
            virtual int get();
        };
    2 int base::get(){}
        --virtual关键字只用在类定义里的函数声明中,写函数体时不用。
        --构造函数和静态成员函数不能是虚函数
    3 虚函数和普通函数差别:虚函数可以参与多态,而普通函数不可以。

多态的表现形式一

    1 派生类的指针可以赋给基类指针
    2 通过基类指针调用基类和派生类中的同名虚函数时:
        (1)若该指针指向一个基类的对象,那么被调用是基类的虚函数
        (2)若该指针指向一个派生类的对象,那么被调用的时派生类的虚函数
        这种机制就叫做多态
    3 例子(见本工程duotai1.cpp)
//
// 多态表现形式一案例
//

#include <iostream>

using namespace std;

class A
{
public:
    virtual void someVirtualFunction()
    {
        cout << "类A的虚函数" << endl;
    }
};

class B:public A
{
public:
    virtual void someVirtualFunction()
    {
        cout << "类B的虚函数" << endl;
    }
};

int main()
{
    B b;
    A* a = &b;
    a->someVirtualFunction();   // 调用哪个虚函数取决于p指向哪种类型的对象

    B b2;
    A& a2 = b2;
    a2.someVirtualFunction();   // 调用哪个虚函数取决于a2引用哪种类型的对象
    return 0;
}


多态的表现形式二

    1 派生类的对象可以赋给基类对象
    2 通过基类引用调用基类和派生类中的同名虚函数时:
        (1)若该引用引用的是一个基类的对象,那么被调用是基类的虚函数
        (2)若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数
        这种机制也叫做“多态”
    3 例子(见duotai1.cpp)
多态简单例子(见本工程duotai2.cpp)
//
// 多态简单例子
//
#include <iostream>

using namespace std;

class A
{
public:
    virtual void Print()
    {
        cout << "A::Print()" << endl;
    }
};

class B:public A
{
    virtual void Print()
    {
        cout << "B::Print()" << endl;
    }
};

class D:public A
{
    virtual void Print()
    {
        cout << "D::Print()" << endl;
    }
};

class E:public B
{
    virtual void Print()
    {
        cout << "E::Print()" << endl;
    }
};

int main()
{
    A a; B b; E e; D d;
    A* pa = &a; B* pb = &b;
    D* pd = &d; E* pe = &e;

    pa->Print();
    pa = pb;
    pa->Print();
    pa = pd;
    pa->Print();
    pa = pe;
    pa->Print();
    return 0;
}

多态的用途:
    增强程序的可扩充性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值