虚函数的多态实现小解

来源:互联网 发布:chromebook ubuntu 编辑:程序博客网 时间:2024/06/05 11:29

要做批注的只有一点,虚表在这几个类中是共享的,并不是每一个类都生成一份自己的虚表。解析是,子类中覆盖的父类中的虚函数,在虚表中是替代了父类那个虚函数的位置,根据向上规则,就实现了多态。

#include<iostream>using namespace std;class base {public:    virtual void print() {        cout << "base::print()" << endl;    }    virtual void goo() {        cout << "base::goo()" << endl;    }};class devired :public base {public:    virtual void print() {        cout << "devired::print()" << endl;    }    virtual void go() {        cout << "devired::go()" << endl;    }};int main(void) {    devired b;    typedef void(*Fun)(void);    Fun pfun = NULL;    for (int i = 0; i < 3; i++)    {        pfun = (Fun)*((int*)*(int*)(&b)+i);        pfun();    }    system("pause");}

上述代码的运行结果

#include<iostream>using namespace std;class point {public:    virtual ~point() { cout << "~point()" << endl; }    virtual point& mult(float) = 0;    float x()const { return _x; }    virtual float y()const { return 0; }    virtual float z()const { return 0; }protected:    point(float x = 0.0) {};    float _x;};class point2 :public point {protected:    float _y;public:    point2(float x = 0.0, float y = 0.0):point(x),_y(y){}    ~point2() { cout << "~point2()" << endl; }    point2& mult(float);    float y()const { return _y; }};class point3 :public point2 {protected:    float _z;public:    point3(float x=0.0,float y=0.0,float z=0.0):point2(x,y),_z(z){}    ~point3() { cout << "~point3()" << endl; }    point3&mult(float);    float z()const { return _z; }};void main(void) {}

此图是侯捷书中所作

原创粉丝点击