剖析C++对象模型
多态:就是指多种形态
C++中虚函数的主要作用就是实现多态, 简单说父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象调用的是父类的虚函数,指向子类对象时调用的是子类的虚函数。
#include
using namespace std;class Base
{
public:
virtual void func1()
{
cout << "Base::func1" << endl;
} virtual void func2()
{
cout << "Base::func2" << endl;
}private:
int a;
};class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
} virtual void func3()
{
cout << "Derive::func3" << endl;
} virtual void func4()
{
cout << "Derive::func4" << endl;
}private:
int b;
};
int main()
{Base b;Deverse d;system("pause");return 0;
}
Base模型分析:
Base实例化的对象b, 通过监视窗口我们可以看到,b中不仅有成员变量_a ,还有__vfptr,它就是虚表指针,虚表指针中下标为0的指向Base::fun1() ,下标为1的指向Base::fun2()
Derive模型分析:
Derive实例化对象d,他继承了Base类,所以可以看到不仅有数据_a还有数据_b,但是在虚函数指针中只显示了两个,按照继承规则,在d中应该有重写了Base的
Derive::fun1, 来自基类的Base::fun2 ,还有Derive::fun3, Derive::fun4
但是没有显示出来,这应该是vs的一个bug;
不过我们可以通过以下方式将他们打印出来:
typedef void (* FUNC) ();void PrintVTable (int* VTable)
{cout<<" 虚表地址>"<< VTable<", i , VTable[i ]);FUNC f = (FUNC) VTable[i ];f();}cout<
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
