【问题标题】:C++ OOP inheritance, why this code couts "Data"C ++ OOP继承,为什么这段代码couts“数据”
【发布时间】:2021-11-23 15:20:57
【问题描述】:

两个类:Data 是父类,DerivedData 是子类。为什么cout 输出“数据”?

class Data {
protected:
    int _value {};

public:
    Data(int value) : _value{ value } { }

    std::string getName() const { 
        return "Data"; 
    }

    int getValue() const { 
        return _value; 
    }

    void setValue(const int i) { 
        _value = i; 
    }
};

class DerivedData: public Data {
public:
    DerivedData(int value) : Data{ value } { }

    std::string getName() const { 
        return "DerivedData"; 
    }

    int getValueDoubled() const { 
        return _value * 2; 
    }
};
DerivedData dd{ 5 };
Data d = dd;
Data& rd = dd;
cout << rd.getName() << endl;

这段代码会输出“Data”,但是为什么呢?

【问题讨论】:

  • 这能回答你的问题吗? Why do we need virtual functions in C++?
  • 你忘记了virtual 是多态函数所必需的。
  • 作为一般提示:对于您要在子类中覆盖的每个函数,添加override 标识符以将其标记为这样,编译器会告诉您该函数是否实际覆盖.如class DerivedData : public Data { public: ...; std::string getName() override const { return "DerivedData"; } ... };

标签: c++ oop inheritance


【解决方案1】:

你没有使用virtual,所以它有点重新定义你认为是多态的父函数,但事实并非如此。

当它执行这行代码 Data&amp; rd = dd; 时,您本来希望打印出 DerviedData 但这并没有发生,因为您的函数不是虚拟的,并且基类不知道您正在覆盖派生中的 getName 方法类。

所以要解决这个问题需要声明你的函数virtual:

virtual std::string getName() const { return "Data"; } //Data

在 DerivedData 中:

std::string getName() const override { return "DerivedData"; } //DerivedData

现在这将按照您预期的方式运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多