打印

内存空间分配问题

[复制链接]
980|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 | 只看该作者
该概念的我还是不大理解的啊,有谁有更好的解释帮我解答下的啊

使用特权

评论回复
5
gxgclg| | 2013-8-30 18:44 | 只看该作者
无冕之王 发表于 2013-8-28 19:31
全局函数、静态函数成员,不同的指针值即也代表不同的函数。
可是非静态函数成员,不同的指针值仅代表“同 ...

解释的相当详细

使用特权

评论回复
6
vivilzb1985| | 2013-9-25 21:58 | 只看该作者
非静态函数成员,不同的指针值仅代表“同一个类中不同的成员函数”而不适合于一个完整继承树中的同名函数(覆盖或重载)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

2404

帖子

2

粉丝