C ++多态 - 将派生元素传递给方法

时间:2017-09-05 08:15:53

标签: c++ polymorphism derived-class base-class

正如标题所说,我在项目开发过程中遇到了多态问题。我已经在网上搜索过但没有回复满足我的疑虑。

所以情况如下:

  1. 为消息定义了基本抽象类,MessageBase 定义了一个抽象类Message,定义了一个派生自Message的模板类MessageBase。然后从MessageBase模板类派生不同的消息(我将提供标题以澄清)
  2. 写了一个方法writeMessage(Message * message);接受指向MessageBase和DerivedMessage继承的基类的指针。
  3. 类定义如下(仅报告头文件):

    //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)'

    修改 以更完整的方式重写了这个问题。抱歉的家伙

1 个答案:

答案 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