正如标题所说,我在项目开发过程中遇到了多态问题。我已经在网上搜索过但没有回复满足我的疑虑。
所以情况如下:
类定义如下(仅报告头文件):
//Message.hh
class Message{
public:
Message();
protected:
virtual void write() = 0;
virtual void read() = 0;
virtual void handle() = 0;
}
//MessageBase.hh
template<typename MessageType>
class Messagebase : public Message {
protected:
Handler handler;
public:
//define the three methods of base class
void write() { handler.write(static_cast<MessageType&>(*this);}
}
void read() { handler.read(static_cast<MessageType&>(*this);}
}
void handle() { handler.handle(static_cast<MessageType&>(*this);}
}
};
//class DerivedMessageX.hh
class DerivedMessageX : public MessageBase<DerivedMessageX> {
public:
...
void setValue(int x);
//other methods of that type of message
}
class Interface{
...
...
public:
void writeMessage(Message* message){
message->write();
}
}
当我尝试调用写入消息时,我执行类似这样的操作:
Message* element = new DerivedMessageX(); //where DerivedMessageX is one of the derived message types
element->setValue(x); //this raise an error, setValue is not part of class Message
interface->writeMessage(element); //here the compiler does not recognize that my "element" is of base type MessageBase and so it tells that it cannot find any prototype to call.
确切的错误是:错误:没有匹配函数来调用'writeMessage(DerivedMessageX * message)'
在我对多态性的理解中,我知道我描述了一个包含纯虚方法的基类,它将对所有派生类都是通用的,派生类将实现它们,以及其他特定的派生类方法。
所以我编写了这个方法,以便接受一个指向基类类型的指针,该类调用在基类级别实现的该对象上的方法。我这样做是因为,只需要调用基类方法,因为我不想重写N个writeMessage方法,我认为传递如上所述创建的派生消息类型可以解决问题。
有人能指出我错在哪里吗?
谢谢你们!
<击> 修改 撞击>
<击>根据要求,writeMessage方法定义如下:
int writeMessage(MessageBase* message){
message->write(); // the method write() is base class level
}
并且错误说:错误:没有匹配函数来调用'writeMessage(DerivedMessageX * message)'
修改 以更完整的方式重写了这个问题。抱歉的家伙
答案 0 :(得分:2)
如果您不提供代码的最小版本,可能会遗漏很多东西。
以下是一个代码片段,可以满足您的需求并运作:
#include <iostream>
class MessageBase
{
public:
// CTOR
MessageBase(){};
virtual void printType(){
std::cout << "MessageBase" << std::endl;
};
};
class DerivedMessageX: public MessageBase
{
public:
// CTOR
DerivedMessageX():MessageBase(){};
void printType(){
std::cout << "DeviredMessageX" << std::endl;
};
};
class Interface
{
public:
Interface(){};
void writeMessage(MessageBase *elem){
elem->printType();
};
};
int main()
{
Interface interface;
MessageBase *base = new MessageBase();
MessageBase *derived = new DerivedMessageX();
interface.writeMessage(base);
interface.writeMessage(derived);
return 1;
};
输出应为:
<强> MessageBase 强>
<强> DerivedMessageX 强>