正如标题所说,我在项目开发过程中遇到了多态性问题。我已经在网上搜索,但没有回应满足我的疑惑。C++多态 - 错误将派生元素传递给方法
因此,情况如下:对于消息
-
定义的基抽象类,MessageBase定义一个抽象类的消息,定义了从消息来源的模板类MessageBase。然后从MessageBase模板类派生不同的消息(我将提供头文件来阐明) - 写了一个方法writeMessage(Message * message);它接受一个指向基类的指针,MessageBase然后继承DerivedMessage。
的类定义如下(报告仅头文件):
//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();
}
}
当我尝试调用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方法,我认为传递如上所述创建的派生消息类型可以实现上述功能。
任何人都可以指出我错在哪里?
谢谢你们!
EDIT
按照要求,的WriteMessage方法被定义如下:
int writeMessage(MessageBase* message){
message->write(); // the method write() is base class level
}
和误差表示:错误:对呼叫“的WriteMessage(DerivedMessageX *消息)没有匹配的功能'
编辑 重写了一个更完整的问题 办法。抱歉,家伙
请告诉我的错误信息? – tkausl
你是否用'public'获得'MessageBase'? – VTT
我编辑了包括他们的问题 –