您的位置:首页 > 编程语言 > C语言/C++

看懂下面C++代码才说你理解了C++多态虚函数!

2013-06-26 10:22 204 查看
#include <iostream>

using namespace std ;

class Father

{

private :

virtual void Say() //只有添加了virtual 关键字声明才会产生虚函数表 虚函数表在编译的时候确定 virtual是实现多态的关键

{

cout<<"Father::Say()"<<endl ;

}

virtual void Run()

{

cout<<"Father:Run()"<<endl;

}

};

class Son :public Father

{

public:

virtual void Run() //派生类虚函数地址 替换父类函数地址在虚函数表中的位置 如需继续被集成那么 仍然要加上virtual

{

cout<<"Son:Run()"<<endl;

}

virtual void MakeLove() //派生类也需要有virtual才有虚函数表函数 派生类只有声明了virtual才会把函数加入虚函数表

{

cout<<"Son::MakeLove();"<<endl;

}

};

class SmallSon:public Son

{

public:

virtual void Run() //

{

cout<<"SmallSon:Run()"<<endl;

}

};

typedef void(*Func)() ; //定义一个函数类型定义

void main()

{

Father fa;

Func func=NULL ;

cout<<"Virtual Table Address:"<<&fa<<endl ;

func=(Func)*((int*)*(int*)(&fa));//把对象首地址转换为int*防止翻转为对象 然后取出virtual table地址 然后在取出第一个虚函数的存放地址转换为int*

//对象首地址存放虚函数表的地址 ,然后转换为int* 取出 虚函数表第一个函数 顺序是虚函数声明顺序

//完全拜托了C++权限控制 这也是C++的缺陷

func();

func=(Func)*((int*)*(int*)(&fa)+1);

func();

Son son ;

func=(Func)*((int*)*(int*)(&son));

func();

func=(Func)*((int*)*(int*)(&son)+1);

func();

func=(Func)*((int*)*(int*)(&son)+2);

func();

SmallSon sson ;

((Func)*((int*)*(int*)&sson))();

((Func)*((int*)*(int*)&sson+1))();

//多层继承 一个表 多重继承多个表 表地址在 对象首地址开始存放

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: