2011-08-13 8 views
0

にアクセスする方法は、私がやりたいものです。オーバー機能 - ここでは、親機能

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は抽象的です。しかし私は、親の情報を1つの場所に出力するコードを持っていたいと思います。これを行う正しい方法は何ですか?ありがとう!

編集:申し訳ありませんが、これはこの行です。return ss << (Msg)in << " Text " << in.text;書く方法はわかりません。

+0

これはconstの正しさに違反します。 –

+0

'(Msg)in'の代わりに' static_cast (in) 'と書いてください。 –

+0

"in.text"?とにかくコンパイルエラーを出すドット表記を使ってプライベートメンバーにアクセスしています。アクセシビリティプライベートメンバーは、ゲッターとセッターの機能によってのみ実行できます。 – Arunmu

答えて

1

Try 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; 
} 

あなたの問題は解決しませんが、問題は解決します。