C++ 虚函数

C++对象模型 吴秦

http://www.cnblogs.com/skynet/p/3343726.html


c++ 虚函数的实现机制

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直接查看虚函数表情况如下


覆盖了原来的虚函数

借用原图,举例说明



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值