C++ 虚函数

一般继承(无虚函数覆盖)

#include<iostream>
using namespace std;

class Base {
    public:
        virtual void f() { cout << "Base::f" << endl; }
        virtual void g() { cout << "Base::g" << endl; }
        virtual void h() { cout << "Base::h" << endl; }
};

class Derive : public Base{
        public:
            virtual void f1() { cout << "Derive::f1" << endl; }
            virtual void g1() { cout << "Derive::g1" << endl; }
            virtual void h1() { cout << "Derive::h1" << endl; }
};

int main(){
    typedef void(*Fun)(void);
    Derive b;
    Fun pFun = NULL;
    cout << "虚函数表地址:" << (int*)(&b) << endl;
    cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
    for(int i = 0; i < 2 * 6; i+=2){
        pFun = (Fun)*((int*)*(int*)(&b)+i);
        pFun();
    }

    return 0;
}

输出如下:

虚函数表地址:0x7ffe8e074290
虚函数表 — 第一个函数地址:0x400c68
Base::f
Base::g
Base::h
Derive::f1
Derive::g1
Derive::h1


一般继承(有虚函数覆盖)

#include<iostream>
using namespace std;

class Base {
    public:
        virtual void f() { cout << "Base::f" << endl; }
        virtual void g() { cout << "Base::g" << endl; }
        virtual void h() { cout << "Base::h" << endl; }
};

class Derive : public Base{
        public:
            virtual void f() { cout << "Derive::f1" << endl; }
            virtual void g1() { cout << "Derive::g1" << endl; }
            virtual void h1() { cout << "Derive::h1" << endl; }
};

int main(){
    typedef void(*Fun)(void);
    Derive b;
    Fun pFun = NULL;
    cout << "虚函数表地址:" << (int*)(&b) << endl;
    cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
    for(int i = 0; i < 2 * 5; i+=2){
        pFun = (Fun)*((int*)*(int*)(&b)+i);
        pFun();
    }

    return 0;
}

输出如下:

虚函数表地址:0x7ffdb5143d80
虚函数表 — 第一个函数地址:0x400c30
Derive::f1
Base::g
Base::h
Derive::g1
Derive::h1


 

多重继承(无虚函数覆盖)

#include<iostream>
using namespace std;

class Base {
    public:
        virtual void f() { cout << "Base::f" << endl; }
        virtual void g() { cout << "Base::g" << endl; }
        virtual void h() { cout << "Base::h" << endl; }
};

class Base1{
    public:
        virtual void f() { cout << "Base1::f" << endl; }
        virtual void g() { cout << "Base1::g" << endl; }
        virtual void h() { cout << "Base1::h" << endl; }
};

class Base2{
    public:
        virtual void f() { cout << "Base2::f" << endl; }
        virtual void g() { cout << "Base2::g" << endl; }
        virtual void h() { cout << "Base2::h" << endl; }
};

class Derive : public Base, public Base1, public Base2{
        public:
            virtual void f1() { cout << "Derive::f1" << endl; }
            virtual void g1() { cout << "Derive::g1" << endl; }
};

int main(){
    typedef void(*Fun)(void);
    Derive b;
    Fun pFun = NULL;
    cout << "虚函数表地址:" << (int*)(&b) << endl;
    cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
    for(int i = 0; i < 2 * 5; i+=2){
        pFun = (Fun)*((int*)*(int*)(&b)+i);
        pFun();
    }
    for(int i = 0; i < 2 * 3; i+=2){
        pFun = (Fun)*((int*)*((int*)(&b)+2)+i);
        pFun();
    }
    for(int i = 0; i < 2 * 3; i+=2){
        pFun = (Fun)*((int*)*((int*)(&b)+4)+i);
        pFun();
    }

    return 0;
}
虚函数表地址:0x7ffe79381ff0
虚函数表 — 第一个函数地址:0x400e08
Base::f
Base::g
Base::h
Derive::f1
Derive::g1
Base1::f
Base1::g
Base1::h
Base2::f
Base2::g
Base2::h


多重继承(有虚函数覆盖)

#include<iostream>
using namespace std;

class Base {
    public:
        virtual void f() { cout << "Base::f" << endl; }
        virtual void g() { cout << "Base::g" << endl; }
        virtual void h() { cout << "Base::h" << endl; }
};

class Base1{
    public:
        virtual void f() { cout << "Base1::f" << endl; }
        virtual void g() { cout << "Base1::g" << endl; }
        virtual void h() { cout << "Base1::h" << endl; }
};

class Base2{
    public:
        virtual void f() { cout << "Base2::f" << endl; }
        virtual void g() { cout << "Base2::g" << endl; }
        virtual void h() { cout << "Base2::h" << endl; }
};

class Derive : public Base, public Base1, public Base2{
        public:
            virtual void f() { cout << "Derive::f1" << endl; }
            virtual void g1() { cout << "Derive::g1" << endl; }
};

int main(){
    typedef void(*Fun)(void);
    Derive b;
    Fun pFun = NULL;
    cout << "虚函数表地址:" << (int*)(&b) << endl;
    cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
    for(int i = 0; i < 2 * 4; i+=2){
        pFun = (Fun)*((int*)*(int*)(&b)+i);
        pFun();
    }
    for(int i = 0; i < 2 * 3; i+=2){
        pFun = (Fun)*((int*)*((int*)(&b)+2)+i);
        pFun();
    }
    for(int i = 0; i < 2 * 3; i+=2){
        pFun = (Fun)*((int*)*((int*)(&b)+4)+i);
        pFun();
    }
    cout<<"-------------------我是分隔线----------------------"<<endl;
    Base *base = &b;
    Base1 *base1 = &b;
    Base2 *base2 = &b;
    base->f();
    base1->f();
    base2->f();
    base->g();
    base1->g();
    base2->g();

    return 0;
}
虚函数表地址:0x7ffcb02fa1e0
虚函数表 — 第一个函数地址:0x400e68
Derive::f1
Base::g
Base::h
Derive::g1
Derive::f1
Base1::g
Base1::h
Derive::f1
Base2::g
Base2::h
-------------------我是分隔线----------------------
Derive::f1
Derive::f1
Derive::f1
Base::g
Base1::g
Base2::g

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值