c++ 中多态的问题,谁能说一下编译器是如何处理的

directxm 2009-03-03 02:21:08
class IEvent1
{
public:
virtual bool OnEvent(void) { return true; }
};

class IEvent2
{
public:
virtual bool OnEvent(class EvParam* param) { return true; }
};

class CSoulEvent : public IEvent1, public IEvent2
{
public:
CSoulEvent(){}
~CSoulEvent(){}
};

class EvParam
{};

void OnEvent_Run()
{
CSoulEvent* event = new CSoulEvent();

event->OnEvent();
}

/*
1>f:\vss\solution\code\gamebryo_question_solution\test.h(33) : error C2385: 对“OnEvent”的访问不明确
1> 可能是“OnEvent”(位于基“IEvent1”中)
1> 也可能是“OnEvent”(位于基“IEvent2”中)
1>f:\vss\solution\code\gamebryo_question_solution\test.h(33) : error C3861: “OnEvent”: 找不到标识符
...全文
187 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CJoneL 2009-03-16
  • 打赏
  • 举报
回复
明显的二义性问题。
void OnEvent_Run()
{
CSoulEvent* event = new CSoulEvent();

event->OnEvent();
}
改成:
void OnEvent_Run()
{
CSoulEvent* event = new CSoulEvent();

event->IEvent1::OnEvent();
}
arong1234 2009-03-16
  • 打赏
  • 举报
回复
楼主有道理,觉得是bug
[Quote=引用 6 楼 directxm 的回复:]
但是还是没有解释为什么会找不到OnEvent

根据c++人语法

我的2个OnEvent的参数是不通的,并且是没有默认参数的.我放在一个类里是可以的.但我把函数分别放在两个类里,就报错了.
[/Quote]
beyond071 2009-03-16
  • 打赏
  • 举报
回复
学习了...
Baruch_Alex 2009-03-16
  • 打赏
  • 举报
回复
请楼主参看C++ primer 4中文版620-621页,有明确的解释,多重继承下导致的二义性问题
wohow 2009-03-16
  • 打赏
  • 举报
回复
来晚了,10楼已经解决了。但是代码中还是要避免这样的二义性问题
ForestDB 2009-03-16
  • 打赏
  • 举报
回复
LZ是不是把重载和多态搞混了。
beyond071 2009-03-16
  • 打赏
  • 举报
回复
effective C++ 第26章 当心潜在的二义性 中 也有相关论述,只能主动避免这种函数命名了
  • 打赏
  • 举报
回复
为何要搞出这样二义性呢?
cheifer 2009-03-03
  • 打赏
  • 举报
回复
楼主说的很对,我想这应该是编译器的一个BUG,按道理来讲应该不会出问题的。
VS编译器一直对多继承支持的不是很好。
lingyin55 2009-03-03
  • 打赏
  • 举报
回复
mark
directxm 2009-03-03
  • 打赏
  • 举报
回复
但是还是没有解释为什么会找不到OnEvent

根据c++人语法

我的2个OnEvent的参数是不通的,并且是没有默认参数的.我放在一个类里是可以的.但我把函数分别放在两个类里,就报错了.
pengzhixi 2009-03-03
  • 打赏
  • 举报
回复
对于含虚函数的类的存储都包含一个一个vptr(虚函数表指针).它指向对象的虚函数列表.
象你这里class IEvent1,class IEvent2,class CSoulEvent他们分别有自己的虚函数列表.
当你定义一个基类指针来指向继承体系中的一个类的对象时,在用这个基类指针来调用虚函数时,会根据基类指针所指的对象类型来找到相对应的虚函数列表里面的函数体.这里要注意的是:一定要使用基类指针来存放对象的地址
arong1234 2009-03-03
  • 打赏
  • 举报
回复
编译器不知道怎么处理,我想你也不应该知道,因为根据你的代码,调用哪个基类的OnEvent都是可能的
因此这个代码本身就是错误,错误的代码编译器当然不该知道怎么处理

如果你恰好知道应该调用哪个基类的OnEvent,你需要显式告诉编译,例如
static_cast<IEvent1*>(p)->OnEvent();
healer_kx 2009-03-03
  • 打赏
  • 举报
回复
这个是C++语法层面不能直接解决的问题,一般都是中间加一个层,来处理这种情况。

「已注销」 2009-03-03
  • 打赏
  • 举报
回复
class IEvent1
{
public:
virtual bool OnEvent(void) = 0; // 用纯虚函数
};

class IEvent2
{
public:
virtual bool OnEvent(class EvParam* param) { return true; }
};

class CSoulEvent : public IEvent1, public IEvent2
{
public:
CSoulEvent() {}
~CSoulEvent() {}

bool OnEvent(void){}
};

class EvParam
{};

void OnEvent_Run()
{
CSoulEvent* event = new CSoulEvent();

event->OnEvent();
}
  • 打赏
  • 举报
回复
不知道要调用那个OnEvent了
于是就给你一个错误.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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