2011-12-08 68 views
14

所以這是我有一個很大的任務的一小部分,我只是不確定這個語法。C++,如何在派生類中調用基類的重載提取操作符?

我有一個名爲Vehicle一個基類,它有以下成員:int fuelAmtint fuelUsage

(我用的命名空間std

我重載<<操作是這樣的:

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; 

我也有一個Airplane類從Vehicle類派生,它引入一個新成員: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; 
} 
相關問題