一般继承(无虚函数覆盖)
#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