C++之虚函数

一、静多态

重载( C++对C的扩展之函数重载)就是静多态,是在编译的时候就知道了该调用哪个函数。这里重点说明第二部分:动多态的实现之一:虚函数。

二、虚函数

利用虚函数实现的动多态,有三个前提条件:

1、父类中有虚函数;
2、子类覆写(override)父类的虚函数;
3、子类对象赋值父类的指针。

给个例子:

class Shape{
public:
    Shape(int x, int y):_x(x), _y(y){}
    virtual void draw(){
        cout << "draw from " << "( " << _x << "," << _y << " )" << endl;
    }
protected:
    int _x;
    int _y;
};

class Rect: public Shape{
public:
    Rect(int x, int y, int len, int wid):Shape(x, y), _len(len), _wid(wid){}
    void draw(){
        cout << "draw from " << "( " << _x << "," << _y << " )";
        cout << " len = " << _len << "  wid = " << _wid << endl;
    }
private:
    int _len;
    int _wid;
};

class Circle: public Shape{
public:
    Circle(int x, int y, int rad):Shape(x, y), _radis(rad){}
    void draw(){
        cout << "draw from " << "( " << _x << "," << _y << " )";
        cout << " radis = " << _radis << endl;
    }
private:
    int _radis;
};

int main()
{
    Circle c(1, 2, 3);
    Rect r(4, 5, 6, 7);
    cout << "-----------子类对象赋给父类对象-------------" << endl;
    Shape& ps1 = c;
    ps1.draw();
    ps1 = r;
    ps1.draw();
    cout << "-----------子类对象赋给父类对象引用-------------" << endl;
    Shape ps2 = c;
    ps2.draw();
    ps2 = r;
    ps2.draw();
    cout << "-----------子类对象赋给父类对象指针-------------" << endl;
    Shape *ps3 = &c;
    ps3->draw();
    ps3 = &r;
    ps3->draw();
    return 0;
}

输出结果:

这里写图片描述

这里稍微点一下父子类间的赋值兼容有三种形式:

1、子类对象赋给父类对象;
2、子类对象赋给父类对象的引用;
3、子类对象赋给父类对象的指针。

这里用这三种赋值兼容的方式进行了演示,显然只有子类对象赋给父类对象的指针实现了虚函数的动多态。

三、虚函数小结

1、声明虚函数是在父类中的成员函数前加virtual关键字。
2、子类可以覆写(override)父类的成员函数,也可以不覆写(不覆写用的就还是父类中的函数)。如果覆写,函数名、参数列表、返回类型必须相同或者是父类虚函数返回类型的子类,其函数前加不加virtual关键字都可以。
3、使用时用父类对象的指针指向子类对象,调用虚函数时,就是调用的子类实现的虚函数。
4、子类覆写的虚函数的访问权限不一定要与父类的虚函数权限一致(一般父类虚函数的访问权限都是public,因为虚函数主要用作对外的接口),主要看子类的用途。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值