Функция перегрузки родительского и дочернего элементов - как получить доступ к родительской функции - PullRequest
0 голосов
/ 13 августа 2011

Вот что я хотел бы сделать:

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 Ответ

1 голос
/ 13 августа 2011

Попробуйте 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;
}

Не отличный дизайн, но решает вашу проблему.

...