多重继承的疑惑?!(Multi Inherit)

Sander 2003-12-26 06:46:45
CABase{ funA();}
CBBase{ funB();}
CMultiDerive:public CABase, Public CBBase

main()
{
VOID p = new CMultiDerive();
(CABase*)p->FunA();
(CBBase*)p->FunB();
}

结果是什么?!
都call的是FunA()?
Why? 怎样解决这个问题,(注意解决方法只能用基类定义,不能用派生类的定义)
...全文
51 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sander 2004-01-16
  • 打赏
  • 举报
回复
ding
Sander 2004-01-05
  • 打赏
  • 举报
回复
欢迎讨论
DoItFreely 2003-12-29
  • 打赏
  • 举报
回复
sorry,中间的"%p"多余,偶没用过cout类
DoItFreely 2003-12-29
  • 打赏
  • 举报
回复
大家可以这么验证:
CmultiDerived *p = NULL;
cout << "%p" << p;
cout << "%p" << (CABase *)p;
cout << "%p" << (CBBase *)p;
void *q = NULL;
cout << "%p" << q;
cout << "%p" << (CABase *)q;
cout << "%p" << (CBBase *)q;
DoItFreely 2003-12-29
  • 打赏
  • 举报
回复
多重继承后基类的this指针偏移量各不相同。
class CMultiDerived : public CABase, public CBBase
内存布局如下:
CABase
CBBase

(CABase *)(CMultiDerived *) => offset 0
(CBBase *)(CMultiDerived *) => offset sizeof(CABase)

(CABase *)(void *) => offset 0
(CBBase *)(void *) => offset 0
也就是说,从void转换成某个基类,编译器不知道转换成合适的偏移量,这就是问题发生的根本原因
superS 2003-12-29
  • 打赏
  • 举报
回复
你既然能
new CMultiDerive
你怎么可能不知道CMultiDerive呢?编译通不过才算不知道啊。不明白。
fohoo 2003-12-29
  • 打赏
  • 举报
回复
void p = new CMultiDerive

这样可以:
((CBBase*)((char*)p + sizeof(CABase)))->FunB()

这样也可以:
static_cast<CBBase*>(static_cast<CMultiDerive*>(p))->funB();
Sander 2003-12-29
  • 打赏
  • 举报
回复
现在关键是不知道是CMultiDerive这个类,但知道是CBBAse类
fohoo 2003-12-29
  • 打赏
  • 举报
回复
我搞错了,我以为是说多重继承重名的情况

如果不重名,直接调就行

CMultiDerive* p = new CMultiDerive();
p->funA();
p->funB();
delete p;
--------------------------------------
void* p = new CMultiDerive();
CMultiDerive* pMD = (CMultiDerive*)p
pMD->funA();
pMD->funB();
delete pMD;

Sander 2003-12-29
  • 打赏
  • 举报
回复
我说过,我不知道哪个object实现的,也就是C*我不知道,
我上面没说清楚吗?!
--------------------------------------------
我说了,别人post一个pointer,我不知道具体的类,但我知道他们的基类。
举例:
CDA:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};
CDB:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};
CDC:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};
CDD:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};

他们都postmsg给一个CCmdMgr的类。然后由这个class来dispatch给关心这些msg的object.
CABase中有一个virtual processmsg().
ross33123 2003-12-29
  • 打赏
  • 举报
回复
补充一下,上面的例子不管AAA()和BBB()是不是virtual 结果都一样
ross33123 2003-12-29
  • 打赏
  • 举报
回复
到现在才大概知道楼主想问什么,好累

提问是给别人看的,要站在别人的角度

楼主看看下面的示例是不是你想要的

如果不是,那可能我永远猜不透你到底要什么了

#include <iostream>
using namespace std;
class A
{
public:
void AAA(){cout<<"a";}
};

class B
{
public:
void BBB(){cout<<"b";}
};

class C:public A, public B
{
};

void main()
{
void *p = new C;
((A *)(C *)p)->AAA();
((B *)(C *)p)->BBB();
}

Sander 2003-12-29
  • 打赏
  • 举报
回复
我说了,别人post一个pointer,我不知道具体的类,但我知道他们的基类。
举例:
CDA:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};
CDB:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};
CDC:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};
CDD:pubilc CBBase, pubilc CABase {postmsg(void* this, ...)};

他们都postmsg给一个CCmdMgr的类。然后由这个class来dispatch给关心这些msg的object.
CABase中有一个virtual processmsg().

ross33123 2003-12-29
  • 打赏
  • 举报
回复
首先 MFC 整个体系采用的单继承,所以不存在楼上所说的问题

其次,搂住说知道是CBBAse类,那么声明p的 时候应该用

CBBase *p = new CMultiDerive();

这样直接用 p->FunB(); 就可以了

而既然不知道是否CABase类

那么 ((CABase *)p)->FunA(); 就没有任何意义了
Sander 2003-12-29
  • 打赏
  • 举报
回复
TO: DoItFreely(Freely)
我知道这样,但我们经常看到教棵书上,利用base class 的virtual fun来表达多太性,
如OnDraw()这个大家共知的function, 如果有一个派生类是多重继承切,OnDraw的base class,不是第一个继承的,那么这个多太性怎么表达呢?
我们不能在用到 (CBase*)OnDraw()这样的语句了?!
Sander 2003-12-28
  • 打赏
  • 举报
回复
up
Sander 2003-12-27
  • 打赏
  • 举报
回复
To:fohoo(飞狐)
标准的处理是在CMultiDerive中override函数FunA,你自己选择调哪个,或都调
你试过调FunB吗

glacierrr 2003-12-26
  • 打赏
  • 举报
回复
以下程序结果为
funA()
funB()

#include <iostream>
using namespace std;

class CABase
{
public:
void funA(){cout << "funA()" << endl;}
};

class CBBase
{
public:
void funB(){cout << "funB()" << endl;}
};

class CMultiDerive : public CABase, public CBBase
{
};

void main()
{
CMultiDerive* p = new CMultiDerive();
((CABase*)p)->funA();
((CBBase*)p)->funB();
delete p;
}



其他请看http://expert.csdn.net/Expert/topic/2582/2582131.xml?temp=.1126978
sea373 2003-12-26
  • 打赏
  • 举报
回复
好象不行
crystal_heart 2003-12-26
  • 打赏
  • 举报
回复
VC不用多重继承就太浪费了。
加载更多回复(8)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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