2016-11-25 9 views
2

私はdogsというクラスを持ち、それを継承しているshepherdというクラスを継承しているとしましょう。今はベースクラスのストリーミング演算子をオーバーロードします。私の派生クラスのためにストリーミング演算子をオーバーロードしています。私は、元のクラスの元々の変数も出力したいと思います。派生クラスのストリーミング演算子も基本クラスを出力する方法

明らかに、ベースクラスのストリーミング演算子のオーバーロードに使用されるコードを貼り付けることができますが、大量のコードをコピーすることを含まないより洗練されたソリューションを探していました(特に、基底クラスの内部)。

例です。

class Dogs 
{ 
public: 
int N_legs; 
bool hair_short; 
}; 

class Shepherd : public Dogs 
{ 
public: 
bool guarding; 
};  

std::ostream &operator<<(std::ostream &os, Dogs dogs) 
{ 
os << "the content of class dogs" << std::endl; 
os << dogs.N_legs << "\t" << dogs.hair_short << std::endl; 
return os; 
} 

私は動的キャストを試みましたが、うまくいきませんでした。メイン

Dogs dogs; 
dogs.N_legs = 4; 
dogs.hair_short = true; 
std::cout << dogs << std::endl; 

Shepherd shepherd; 
shepherd.N_legs = 4; 
shepherd.guarding = true; 
std::cout << shepherd << std::endl; 

std::ostream &operator<<(std::ostream &os, Shepherd shepherd) 
{ 
os << dynamic_cast<Dogs>(shepherd); 

os << "The content of class shepherd" << std::endl; 
os << shepherd.guarding << std::endl; 
return os; 
}; 

どこかはさて、これは私だけ(あなたが動的キャストをコメントアウト)派生クラス変数で構成された出力が得られますが、私もコンテンツを持っていると思います基本クラスの

+0

あなたは*参照のポインタを使用する必要が動作するように*。代わりに参照*を引数として出力演算子*に渡してみてください。好ましくは定数参照(つまり、それぞれconst Shepherd& 'const Dogs&') –

答えて

1

dyanamic_castは参照とポインタでのみ動作します。そのため、コードはコンパイルできません。パラメータのタイプをconst &に変更する必要があります。これは、エラーを修正するだけでなく、不要なコピーを避けるためです。

std::ostream &operator<<(std::ostream &os, const Dogs& dogs) 
std::ostream &operator<<(std::ostream &os, const Shepherd& shepherd) 
{ 
os << dynamic_cast<const Dogs&>(shepherd); 
... 

BTW:この場合はstatic_castで十分です。 がShepherdの基本クラスであることが常にわかっているので、

+0

ありがとうございます。 – LinG

0

dynamic_castはここでは必要ありません。単にstatic_castを使用します。

std::ostream &operator<<(std::ostream &os, const Shepherd& shepherd) 
{ 
    os << static_cast<const Dogs&>(sheperd); 

    os << "The content of class shepherd" << std::endl; 
    os << shepherd.guarding << std::endl; 

    return os; 
}; 
0

使用static_cast代わりに。あなたはコンパイル時にベース型を知っています!多型(と `dynamic_cast`)については

std::ostream &operator<<(std::ostream &os, Shepherd shepherd) { 
    os << static_cast<Dogs>(shepherd); 
    os << "The content of class shepherd" << std::endl; 
    os << shepherd.guarding << std::endl; 
    return os; 
} 

Here's a Wandbox link.

関連する問題