关于虚拟表的问题?高分求教

ququshb 2002-05-17 10:31:21
有如下类:
class A {
virtual void aa();
}
class B : public A
{
virtual void bb();
}
class C : public A
{
virtual void cc();
}
class D : public B,public C
{
virtual void dd();
}

他的虚表是怎么样的呢?

vptr --------> A::aa
B::bb
C::cc
D::dd

还是
vptr ---------> A::aa
vptr ------| B::bb
| D::dd
|
|----> A::aa
C::cc
D::dd
到地是几个 vptr ,到地是几个表啊?
...全文
26 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ququshb 2002-06-03
  • 打赏
  • 举报
回复
已经知道了:
A: vptr --------> A::aa

B: vptr --------> A::aa
B::bb

C: vptr --------> A::aa
C::cc

D: vptr ---------> A::aa
vptr ------| B::bb
| D::dd
|
|----> A::aa
C::cc
D::dd
ququshb 2002-05-23
  • 打赏
  • 举报
回复
已决
stzhou 2002-05-20
  • 打赏
  • 举报
回复
《C++对象模型》中对此问题有非常深入的描述,建议你看一看!
fxjtoday 2002-05-20
  • 打赏
  • 举报
回复

每一个类都对应一张虚拟表。
A ,B,C,D各有一张虚拟表。
表的内容,关键看实现了。
以b为例
b类中:
class B : virtual public A
{
virtual void bb();
}
如实现中,没有重新实现aa函数,则b的
虚拟表:
aa A::aa()
bb B::bb()
如在b中,重新实现了aa函数,则b的
虚拟表:
aa B::aa()
bb B::bb()

c,d的虚拟表同理。
有不对处,望各位大虾指教。^_^
duanrain 2002-05-19
  • 打赏
  • 举报
回复
纠正一个错误 aa这些函数不是虚函数(void aa() = 0;)

这里有一个当初我研究虚继承的结果,其中主要是为了搞清楚虚继承时候,对象的内存布局。
强烈建议看一下C++本质论,里面有C++编译器一级的详细说明(CFront实现,但是有很大的帮助)。

// -----------------------------------------------------------------------------------

class A
{
public:
int i;

A(int a) { i = a; }
virtual ~A() {}
};

class B : public virtual A, public virtual Base1, public virtual Base2
{
public:
int ii[4];
B() : A(2) {}
void f()
{
int a = i;
}
};

class C : public virtual A
{
public:
C() : A(3) {}
};

class D : public B, public C
{
public:
int tt[2];
D() : A(4) {}
};

// -----------------------------------------------------------------------------------

DWORD B::`vbtable`[] =
{
0,
sizeof(B),
sizeof(B) + sizeof(A),
sizeof(B) + sizeof(A) + sizeof(Base1)
};

DWORD C::`vbtable`[] =
{
0,
sizeof(C)
};

DWORD D_B::`vbtable`[] =
{
0,
sizeof(D) - offset(B)
};

DWORD D_C::`vbtable`[] =
{
0,
sizeof(D) - offset(C)
};

struct B
{
void* vbtable;
// A theA;
// Base1 theBase1
// Base2 theBase2
}

struct C
{
void* vbtable;
// A theA;
};

struct D
{
B b;
C c;
int tt[2];
// A theA;
}

B::B(bFlag, pThis, a)
{
if (bFlag)
{
vbtable = B::`vbtable`;
call A::A(pThis + sizeof(B), a);
}
}

B::B(bFlag, pThis, a)
{
if (bFlag)
{
pA = pThis + sizeof(B);
call A::A(pA, a);
}
}

C::C(bFlag, pThis, a)
{
if (bFlag)
{
vbtable = C::`vbtable`;
call A::A(pThis + sizeof(C), a);
}
}

C::C(bFlag, pThis, a)
{
if (bFlag)
{
pA = pThis + sizeof(C);
call A::A(pA, a);
}
}

D::D(bFlag, pThis, a)
{
if (bFlag)
{
B::vbtable = D_B::`vbtable`;
C::vbtable = D_C::`vbtable`;
call A::A(pThis + sizeof(D), a);
}
call B::B(pThis, a);
call C::C(pThis + sizeof(B), a);
}

D::D(bFlag, pThis, a)
{
if (bFlag)
{
C::pA = B::pA = pThis + sizeof(D);
call A::A(B::pA, a);
}
call B::B(pThis, a);
call C::C(pThis + sizeof(B), a);
}
ququshb 2002-05-17
  • 打赏
  • 举报
回复
我是想问 虚表在内存中到底是什么样的,特别是多继承的时候,单继承呢?菱形继承呢?
Koshima 2002-05-17
  • 打赏
  • 举报
回复
你的函数:aa();bb();cc();不是纯虚函数,在什么地方实现的呢?
所以表的形状不能确定!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧