父和子的重载功能 - 如何访问父功能

时间:2011-08-13 16:24:54

标签: c++ inheritance overloading

以下是我想做的事情:

class Msg {
    int target;
public:
    Msg(int target): target(target) { }
    virtual ~Msg () { }
    virtual MsgType GetType()=0;
};

inline std::ostream& operator <<(std::ostream& ss,Msg const& in) {
    return ss << "Target " << in.target;
}

class Greeting : public Msg {
    std::string text;
public:
    Greeting(int target,std::string const& text) : Msg(target),text(text);
    MsgType GetType() { return TypeGreeting; }
};

inline std::ostream& operator <<(std::ostream& ss,Greeting const& in) {
    return ss << (Msg)in << " Text " << in.text;
}

不幸的是,这不起作用,因为Msg是抽象的,第二行最后一行的Msg转换失败。但是,我希望代码只在一个地方输出父级的信息。这样做的正确方法是什么?谢谢!

编辑:对不起,为了清楚,这是return ss << (Msg)in << " Text " << in.text;我不知道怎么写。

1 个答案:

答案 0 :(得分:1)

试试ss<<(Msg const&)in。 也许你必须让运营商成为Greeting班的朋友。

#include "iostream"
#include "string"

typedef enum {  TypeGreeting} MsgType;

class Msg {
    friend inline std::ostream& operator <<(std::ostream& ss,Msg const& in);

    int target;
public:
    Msg(int target): target(target) { }
    virtual ~Msg () { };
        virtual MsgType GetType()=0;
};

inline std::ostream& operator <<(std::ostream& ss,Msg const& in) {
    return ss << "Target " << in.target;
}

class Greeting : public Msg {
    friend inline std::ostream& operator <<(std::ostream& ss,Greeting const& in);

    std::string text;
public:
    Greeting(int target,std::string const& text) : Msg(target),text(text) {};
    MsgType GetType() { return TypeGreeting; }

};

inline std::ostream& operator <<(std::ostream& ss,Greeting const& in) {
    return ss << (Msg const&)in << " Text " << in.text;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Greeting grt(1,"HELLZ");
    std::cout << grt << std::endl;
    return 0;
}

不是很好的设计,但解决了你的问题。