C++,如何在派生类中调用基类的重载提取运算符?

Posted

技术标签:

【中文标题】C++,如何在派生类中调用基类的重载提取运算符?【英文标题】:C++, How do I call a Base classes' overloaded extraction operator in a derived class? 【发布时间】:2012-01-15 17:58:18 【问题描述】:

所以这是我的一个大任务的一小部分,我只是不确定它的语法。

我有一个名为 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;

我还有一个派生自Vehicle 类的Airplane 类,它引入了一个新成员:int numEngines

如何在Airplane 类中重载&lt;&lt; 运算符,以便它首先调用“车辆重载运算符结果”,然后是我告诉&lt;&lt; 运算符从派生类...所以,这就是我的意思:

我需要它在 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

【问题讨论】:

In operator 【参考方案1】:

由于操作符

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

【讨论】:

【参考方案2】:

以下内容如何:

ostream& operator<<(ostream& osObject, const Airplane& myAirplane)

    osObject << static_cast<const Vehicle &>(myAirplane);
    osObject << "Number of Engines: " << myAirplane.numEngines << endl;

    return osObject;

【讨论】:

你应该投到const vehicle&amp; @ArmenTsirunyan:根据您的建议更新答案 不应该把*static_cast&lt;Vehicle *&gt;(this)中的this换成&amp;myAirplane吗?同样,不是Airplane.numEngines 不应该是myAirplane.numEngines @yasouser:这个?这是什么?这是一个非成员函数!【参考方案3】:
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++中的虚函数有啥作用?

c ++:是不是可以在派生类中定义重载运算符,这将工作objs基类类型

c ++继承:基类中的2次重载运算符+在派生类中无法正常工作

使用 C++ 定义接口(在不丢失基类的所有重载运算符的情况下派生)

Effective C++ 6.继承与面向对象设计

类的继承