2011-12-08 7 views
14

これは私が持っている大きな課題のほんの一部ですが、私はこれについての構文が不明です。C++、派生クラスでBaseクラスのオーバーロードされた抽出演算子を呼び出すにはどうすればよいですか?

私はこれらのメンバーがあるVehicleという名前の基底クラス、持っている:(私は名前空間stdを使用していますint fuelAmtint fuelUsageを)

)を

私は<<オペレータをこのように、オーバーロード:

ostream& operator<<(ostream& osObject, const Vehicle& myVehicle) 
{ 
    cout << "Fuel Usage Rate: " << myVehicle.fuelUsage << endl 
     << "Fuel Amount:  " << myVehicle.fuelAmt << endl; 

    return osObject; 
} 

私はそれをこのように呼びます:

cout << Vehicle; 

結果(例)である。

Fuel Usage Rate: 10; 
Fuel Amount: 50; 

私もVehicleクラスから派生Airplaneクラスを持って、それが新たなメンバーを紹介:int numEngines。それは最初に「車両オーバーロードされた演算子の結果」と呼ぶ、と私は、派生クラスから印刷する<<オペレータに伝えるものは何でもする、その後の結果になるように、私は、Airplaneクラスで<<演算子をオーバーロードすることができますどのように

...だから、ここで私が何を意味するかです:

私はそれがAirplaneクラスでこのように機能する必要があります。

ostream& operator<<(ostream& osObject, const Airplane& myAirplane) 
{ 
     //First print the Fuel Usage rate and Fuel amount by calling 
     //the Base class overloaded << function 

     //then 
     cout << "Number of Engines: " << myAirplane.numEngines << endl; 

    return osObject; 
} 

は、どのように私はこの派生クラスでそのメンバーの値を出力するベースクラスの実行をトリガしますか?

ヘッダーを変更するようなものですか?以下について

ostream& operator<<(ostream& osObject, const Airplane& myAirplane): operator<<Vehicle 
+1

<<車両のためにあなたが書き込み、その魔法を動作しますcout。 osObjectに書き込む必要があります。 – user763305

答えて

16

方法:このよう

ostream& operator<<(ostream& osObject, const Airplane& myAirplane) 
{ 
    osObject << static_cast<const Vehicle &>(myAirplane); 
    osObject << "Number of Engines: " << myAirplane.numEngines << endl; 

    return osObject; 
} 
+0

あなたは 'const vehicle&'にキャストすべきです –

+0

@ArmenTsirunyan:あなたの提案で更新された答え –

+0

'* static_cast (this)'の 'this'を'&myAirplane'に置き換えてはいけませんか?同様に 'Airplane.numEngines'の代わりに' myAirplane.numEngines'を使うべきでしょうか? – yasouser

16

オペレータ< <は非会員機能ですので、あなたが何をしたい理想的である、それは仮想宣言することはできません。だから、

class Base 
{ 
public: 
    virtual std::ostream& output(std::ostream& out) const 
    { 
     return out << "Base"; 
    } 
    virtual ~Base() {} //Let's not forget to have destructor virtual 
}; 

class Derived : public Base 
{ 
public: 
    virtual std::ostream& output(std::ostream& out) const 
    { 
     Base::output(out); //<------------------------ 
     return out << "DerivedPart"; 
    } 
    virtual ~Derived() {} //Let's not forget to have destructor virtual 
}; 

次の操作を行い、最終的には、唯一の基本クラスのオペレーター< <を持っており、仮想ディスパッチは、オペレータに

std::ostream& operator << (std::ostream& out, const Base& b) 
{ 
    return b.output(out); 
} 
1
ostream& operator<<(ostream& osObject, const Airplane& myAirplane) 
{ 
    //First print the Fuel Usage rate and Fuel amount by calling 
    //the Base class overloaded << function 
    cout << (Vehicle&) myAirplane; 

    //then 
    cout << "Number of Engines: " << myAirplane.numEngines << endl; 

    return osObject; 
} 
関連する問題