ostream& operator<<
これは、基本クラスのコードを複製せずに、派生クラスのをオーバーロードする唯一の方法ですか?キャストは避けるべきものではありませんか?
基本クラスのデータをstd::operator <<が(文字列のように)「食い尽くす」ことができるものとして表す、基本クラス内のある種の関数を定義することを除いて、他の方法はわかりません。派生クラスに対して同じことを行います(派生クラスstream内の基本クラスストリーム表現関数を呼び出します。もちろん、rep。関数を呼び出します)。
この問題の理想的な解決策は何ですか?
#include <iostream>
class Base
{
private:
int b_;
public:
Base()
:
b_()
{};
Base (int b)
:
b_(b)
{};
friend std::ostream& operator<<(std::ostream& os, const Base& b);
};
std::ostream& operator<< (std::ostream& os, const Base& b)
{
os << b.b_;
return os;
}
class Derived
:
public Base
{
private:
int d_;
public:
Derived()
:
d_()
{};
Derived (int b, int d)
:
Base(b),
d_(d)
{};
friend std::ostream& operator<<(std::ostream& os, const Derived& b);
};
std::ostream& operator<< (std::ostream& os, const Derived& b)
{
os << static_cast<const Base&>(b) << " " << b.d_;
return os;
}
using namespace std;
int main(int argc, const char *argv[])
{
Base b(4);
cout << b << endl;
Derived d(4,5);
cout << d << endl;
return 0;
}