单一继承下虚函数覆盖时vftb的排列
2015-04-25 09:57
218 查看
#include <iostream> #include <string> #include <vector> #include <cctype> using namespace std; //单一继承下有虚函数覆盖 //派生类只有一个虚函数表,派生类对象只有一个虚指针来指向这个虚函数表。 //虚函数表中按照基类虚函数(若派生类override基类的虚函数,则虚函数表中原先存放的基类虚函数的地址变为相应的派生的虚函数的地址)、派生类新增的虚函数顺序依次排列。 class Base { public: int x; 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: int y; virtual void f(){cout << "Derive::f" << endl;} virtual void g(){cout << "Derive::gg" << endl;} virtual void hh(){cout << "Derive::hh" << endl;} }; typedef void (*Fun)(); int main() { Fun pFun; Base base; void*** p = (void***)&base; cout<<*p<<endl; // 虚函数表的地址 cout<<(**p)<<endl; //虚函数表中指向第一个虚函数的地址 cout<<(*p)[1]<<endl; cout<<(*p)[2]<<endl; Derive derive; void*** q = (void***)&derive; cout<<*q<<endl; // 虚函数表的地址 //由于derive类override基类的第一个虚函数f();此时派生类虚函数表中的第一项的内容为指向Derive类f()函数的地址 cout<<(**q)<<endl; //虚函数表中指向第一个虚函数的地址Derive::f(){} //cout<<(***q)<<endl; // !!!错误,提示表达式必须是指向完整类型的指针,q为void之故 //对象运行时类型识别的指针 ,存放在vptr-1处的内存中 //cout<<*((*q)-1)<<endl; // //下面两种表示方式意义相同 //cout<<*((*q)+1)<<endl; //虚函数表中指向第2个虚函数的地址,derive类override基类的第一个虚函数g() cout<<(*q)[1]<<endl; //指向第一个虚函数的地址Derive::g(){} //cout<<*((*q)+2)<<endl; //虚函数表中指向第3个虚函数的地址,由于没有覆盖,指向基类的第3个虚函数Base::h() cout<<(*q)[2]<<endl; //cout<<*((*q)+3)<<endl; //虚函数表中指向第4个虚函数的地址;指向派生类新增的虚函数Derive::hh() cout<<(*q)[3]<<endl; //cout<<*((*q)+4)<<endl; //虚函数表中指向第5个虚函数的地址;由于不存在第五个虚函数,输出结果地址是空。 cout<<(*q)[4]<<endl; pFun = (Fun)(**q); pFun(); pFun = (Fun)((*q)[1]); pFun(); pFun = (Fun)((*q)[2]); pFun(); pFun = (Fun)((*q)[3]); pFun(); system("pause"); return 0; }
相关文章推荐
- 多继承无虚函数覆盖下的vftb排列
- 多继承(含虚函数覆盖)vftb中虚函数排列
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取(二)
- [c++]继承覆盖与函数重载
- 静态成员(成员函数+数据成员)继承中同样存在覆盖基类,而非共存子类
- 继承与多态---上 --- 函数重写、多态、虚函数、覆盖、隐藏
- 继承 单继承 多层继承 成员变量:this & super ; 成员函数:覆盖操作; 一个对象实例化过程!!
- C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别
- C++成员函数的重载,继承,覆盖和隐藏
- 虚函数表之多继承有函数覆盖
- 关于C++多重继承的时候虚函数覆盖的问题
- C++成员函数的重载,继承,覆盖和隐藏
- 虚函数与多态性,虚拟继承,纯虚函数及重载、覆盖、隐藏的区别
- 问题记录之Activity的继承类的继承类覆盖的onCreate()函数,无法成功setContentView
- C++继承中覆盖和隐藏基类成员变量或成员函数
- 从虚函数的内存构造谈C++继承中函数的覆盖与隐藏
- 关于多重继承中覆盖虚基类的函数问题--《C++程序设计语言》
- C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)
- 拥有虚函数覆盖的菱形继承及菱形虚拟继承