c++虚函数表详解
来源:互联网 发布:数据分析报告怎么收费 编辑:程序博客网 时间:2024/06/04 16:17
编译器将虚函数表在编译时存放在对象的头部,因此我们可以自由的访问虚函数。
1. 访问对象的数函数表。
比如有这样一个类:
class A
{
public:
virtual int test1()
{
printf("A::test1/n");
return 0;
}
virtual int test2()
{
printf("A::test2/n");
return 0;
}
virtual int test3()
{
printf("A::test3/n");
return 0;
}
};
// 创建A的对象a
A a;
通过查找虚函数表来访问该对象的虚函数:
typedef int (* FUNC)(void);
FUNC func = (FUNC)*(int *)*((int *)&a + 0);
func();
func = (FUNC)*((int *)*(int *)&a + 1);
func();
func = (FUNC)*((int *)*(int *)&a + 2);
func();
对象a的虚函数表布局
A::test1 A::test2 A::test3
2. 子类重载了父类的虚函数。
比如:
class B:public A
{
public:
virtual int test1()
{
printf("B::test1/n");
return 0;
}
};
那么对象b的虚函数表布局应该是:
B::test1 A::test2 A::test3
3. 子类没有重载父类的虚函数
比如:
class B:public A
{
public:
virtual int test4()
{
printf("B::test4/n");
return 0;
}
};
那么对象b的虚函数表布局应该是:
A::test1 A::test2 A::test3 B::test1
4. 多重继承,有重载。
比如:
class A
{
public:
virtual int test1()
{
printf("A::test1/n");
return 0;
}
virtual int test2()
{
printf("A::test2/n");
return 0;
}
virtual int test3()
{
printf("A::test3/n");
return 0;
}
};
class C
{
public:
virtual int test1()
{
printf("C::test1/n");
return 0;
}
virtual int test4()
{
printf("C::test4/n");
return 0;
}
};
class B:public A, public C
{
public:
virtual int test1()
{
printf("B::test1/n");
return 0;
}
};
那么对象b的虚函数表布局应该是:
B::test1 A::test2 A::test3
B::test1 C::test4
5. 多重继承,没有重载。
class B:public A, public C
{
public:
virtual int test5()
{
printf("B::test5/n");
return 0;
}
};
那么对象b的虚函数表布局应该是:
A::test1 A::test2 A::test3 b::test5
C::test1 C::test4
- 虚函数详解(C++)
- c#日期函数详解
- C函数Strtok详解
- C语言函数详解
- c++string函数详解
- c函数指针详解
- c函数指针详解
- c函数指针详解
- c函数指针详解
- c :函数指针详解
- C函数指针详解
- c函数指针详解
- c函数指针详解
- c函数指针详解
- NDK c函数详解
- C fork()函数详解
- c语言函数详解
- c++string函数详解
- 区域增长算法
- 重载与覆盖的区别
- 实模式和保护模式
- 关于HibernateDaoSupport类
- FpSpread表格控件,FpSpread事件介绍(一)
- c++虚函数表详解
- Spread基本知识(二)
- FarPoint FpSpread控件的使用心得
- FarPoint控件属性说明:
- 《微软的梦工场》---Jonathan Tien[zz]
- FarPoint Spread 控件如何实现剪切,粘贴,复制
- 英文地址书写格式
- romInit.s分析
- C#正则表达式整理备忘