2011-12-08 43 views
14

Vì vậy, đây là một phần nhỏ của một nhiệm vụ lớn tôi có, tôi chỉ không chắc chắn về cú pháp cho việc này.C++, Làm cách nào để gọi toán tử khai thác quá tải của lớp cơ sở trong lớp dẫn xuất?

Tôi có một lớp cơ sở tên Vehicle, trong đó có các thành viên: int fuelAmtint fuelUsage)

(Tôi đang sử dụng namespace std)

Tôi quá tải các << điều hành theo cách này:

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

    return osObject; 
} 

Tôi sau đó gọi theo cách này:

cout << Vehicle; 

Kết quả là (ví dụ):

Fuel Usage Rate: 10; 
Fuel Amount: 50; 

Tôi cũng có một lớp Airplane mà xuất phát từ lớp Vehicle, nó giới thiệu một thành viên mới: int numEngines.

Làm thế nào tôi có thể nạp chồng toán tử << trong lớp Airplane, để nó đầu tiên sẽ gọi là "xe quá tải kết quả điều hành", và sau đó là kết quả của bất cứ điều gì tôi nói với các nhà điều hành << in từ các lớp có nguồn gốc ... Vì vậy, đây là những gì tôi muốn nói:

tôi cần nó hoạt động như thế này trong lớp 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; 
} 

làm thế nào để kích hoạt thực thi lớp cơ sở xuất ra giá trị của các thành viên, trong lớp có nguồn gốc này?

Có giống như thay đổi tiêu đề không? Như thế này:

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

Trong operator << cho xe của bạn viết thư cho cout. Bạn nên viết thư cho osObject. – user763305

Trả lời

16

Làm thế nào về những điều sau đây:

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

    return osObject; 
} 
+0

bạn nên chuyển sang 'const vehicle &' –

+0

@ArmenTsirunyan: Cập nhật câu trả lời với đề xuất của bạn –

+0

Không phải là 'this' trong '* static_cast (this)' được thay thế bằng '& myAirplane'? Tương tự như vậy thay vì 'Airplane.numEngines' không phải là' myAirplane.numEngines'? – yasouser

16

Kể từ khi các nhà điều hành < < là một chức năng là thành viên đệ, bạn không thể khai báo nó ảo, đó là lý tưởng những gì bạn muốn. Vì vậy, bạn làm như sau

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

và cuối cùng, có nhà điều hành < < chỉ lớp cơ sở và các công văn ảo sẽ làm việc kỳ diệu

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; 
} 
Các vấn đề liên quan