C++对象模型 吴秦
http://www.cnblogs.com/skynet/p/3343726.html
http://blog.youkuaiyun.com/jiangnanyouzi/article/details/3720807
上面的文章也是转载的,没有原博文地址,。。
虚函数概念,使用等可以参考:http://c.biancheng.net/cpp/biancheng/view/244.html
或者查看C++经典图书
下面是我按照着用vs2013做的(建议自己动手验证)
#include <iostream>
using namespace std;
typedef void(*Fun)(void);
class Base
{
public:
virtual void f(){ cout << "Base::f()" << endl; }
virtual void g() { cout << "Base::g()" << endl; }
int a;
};
int main(void)
{
Base b;
b.a = 10;
Fun pFun = NULL;
int *pb = (int *)&b;
//int *vptr = (int*)*(int*)(&b);
//int *vptr = (int *)( ((int*)(&b))[0] );
int *vptr = (int *)*(pb + 0);// 虚函数的首地址
pFun = (Fun)*(vptr + 0);
pFun();
pFun = (Fun)*(vptr + 1);
pFun();
int tmpa = *(pb + 1);
printf("%d\n", tmpa);
tmpa = *(pb + 2);
printf("%d\n", tmpa);
//printf("%d\n", b.a);
return 0;
}
运行结果如下
继承后 代码如下,运行结果如下
#include <iostream>
using namespace std;
typedef void(*Fun)(void);
class Base
{
public:
virtual void f(){ cout << "Base::f()" << endl; }
virtual void g() { cout << "Base::g()" << endl; }
int a;
};
class son :public Base
{
public:
int b;
//void f(){ cout << "son::f()" << endl; }
void g() { cout << "son::g()" << endl; }
virtual void h() { cout << "son::h()" << endl; }
};
int main(void)
{
son s;
s.a = 10;
s.b = 12;
Fun pFun = NULL;
int *p = (int *)&s;
int *vptr = (int *)*(p + 0);// 虚函数的首地址
pFun = (Fun)*(vptr + 0);
pFun();
pFun = (Fun)*(vptr + 1);
pFun();
pFun = (Fun)*(vptr + 2);
pFun();
int tmp = *(p + 1);
printf("%d\n", tmp);
tmp = *(p + 2);
printf("%d\n", tmp);
return 0;
}
运行结果如下:
可以发现
1) 虚函数表存在,虚函数按照顺序在虚函数表中
2)父类的虚函数在子类虚函数的前面
当子类重写了父类的虚函数后,子类虚函数表中是自己重写后的
若没有重写,直接继承了父类的虚函数,则仍然为父类的虚函数
----------------------------------------------------------------------------------------------------------------------------------------
vs2013查看虚函数表使用详见:
http://www.cnblogs.com/-wang-cheng/p/5441487.html
编写如下的多重继承程序
#include <iostream>
using namespace std;
typedef void(*Fun)(void);
class Base1
{
public:
virtual void f(){ cout << "Base1::f()" << endl; }
};
class Base2
{
public:
virtual void g() { cout << "Base2::g()" << endl; }
};
class Base3
{
public:
virtual void f(){ cout << "Base3::f()" << endl; }
virtual void g() { cout << "Base3::g()" << endl; }
};
class Son :public Base1, public Base2, public Base3
{
public:
int b;
void f(){ cout << "son::f()" << endl; }
void g() { cout << "son::g()" << endl; }
virtual void h() { cout << "son::h()" << endl; }
};
int main(void)
{
Son s;
s.b = 12;
Fun pFun = NULL;
int *p = (int *)&s;
int *vB1 = (int *)*(p + 0);
int *vB2 = (int *)*(p + 1);
int *vB3 = (int *)*(p + 2);
pFun = (Fun)*(vB1 + 0);
pFun();
int tmp = *(p + 3);
printf("%d\n", tmp);
return 0;
}
程序运行结果如下
采用vs2013直接查看虚函数表情况如下
覆盖了原来的虚函数
借用原图,举例说明
、