内存空间分配问题

[复制链接]
1353|5
 楼主| dfsa 发表于 2013-8-28 19:01 | 显示全部楼层 |阅读模式
#include <iostream>
using namespace std;

class A {
public:
virtual void aa1() {}
virtual void aa2() {}
};

class B : public virtual A
{
public:
virtual void bb() {}
};

class C : public virtual A
{
public:
virtual void cc() {}
};
class D :  public B, public C
{
public:
virtual void dd1() {}
virtual void dd2() {}
};

int main()
{

printf("0x%08x\n",&D::aa1);
printf("0x%08x\n",&D::aa2);
printf("0x%08x\n",&D::bb);
printf("0x%08x\n",&D::cc);
printf("0x%08x\n",&D::dd1);
printf("0x%08x\n",&D::dd2);
return 0;
}
结果:
0x00401014
0x00401019
0x00401014
0x00401014
0x00401019
0x0040101e
怎么不同的函数有相同的地址?
无冕之王 发表于 2013-8-28 19:31 | 显示全部楼层
全局函数、静态函数成员,不同的指针值即也代表不同的函数。
可是非静态函数成员,不同的指针值仅代表“同一个类中不同的成员函数”而不适合于一个完整继承树中的同名函数(覆盖或重载)。这些函数在运行时的地址值不限制是否相同(但是却规定具有不同的类型)。
具体实现时,编译器可以/可能根据不同的成员指针动态的决定当前所承认的对象类型。(vc下面成员指针都是sizeof(void*)+2的位宽)
baidudz 发表于 2013-8-28 19:34 | 显示全部楼层
因为虚函数表布局的关系
shenmu2012 发表于 2013-8-30 00:11 | 显示全部楼层
该概念的我还是不大理解的啊,有谁有更好的解释帮我解答下的啊
gxgclg 发表于 2013-8-30 18:44 | 显示全部楼层
无冕之王 发表于 2013-8-28 19:31
全局函数、静态函数成员,不同的指针值即也代表不同的函数。
可是非静态函数成员,不同的指针值仅代表“同 ...

解释的相当详细
vivilzb1985 发表于 2013-9-25 21:58 | 显示全部楼层
非静态函数成员,不同的指针值仅代表“同一个类中不同的成员函数”而不适合于一个完整继承树中的同名函数(覆盖或重载)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

2404

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部