C++之虚函数

来源:互联网 发布:mmd舞蹈动作数据 编辑:程序博客网 时间:2024/04/30 11:36

一、静多态

重载( 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,因为虚函数主要用作对外的接口),主要看子类的用途。

0 0