【问题标题】:C++, How do I call a Base classes' overloaded extraction operator in a derived class?C++,如何在派生类中调用基类的重载提取运算符?
【发布时间】: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

标签: c++ inheritance overriding overloading


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2013-12-17
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多