为什么我的继承方法输出的是 Base class' 成员而不是派生的 class' 成员

Why is my inherited method outputting Base class' member instead of derived class' member

我正在尝试从 Mum class 打印成员 'age',它继承了 Dad 的方法 print_age(),但它正在打印成员 'age'来自爸爸的 class

#include <iostream>
#include <string>

using namespace std;

int main()
{

  class Dad
  {
  protected:
    int age = 59;

  public:
    void print_age() { cout << age << endl; }
  };

  class Mum : public Dad
  {
  protected:
    int age = 54;
  };

  Mum m;
  m.print_age();
}

当我希望它输出 54

时,它会输出 59

函数是从 Dad 调用的。在 Dad 中,Dad 的年龄将是输出。

在C++中,只能覆盖成员函数,不能覆盖成员变量。结果,当你写

  class Mum : public Dad
  {
  protected:
    int age = 54;
  };

C++ 将此解释为 "I know that Dad already has an int field called age whose value is 59, but I'd like to also add a different int field called age whose value is 59 and that only lives in the Mum class." 换句话说,您并不是用新值替换 age 的旧值;您正在声明一个 Dad 不知道的新变量,恰好与 Dad.

中的变量之一同名

现在,为什么这意味着您看到了值 59?让我们看看 Dad:

的代码
  class Dad
  {
  protected:
    int age = 59;

  public:
    void print_age() { cout << age << endl; }
  };

print_age中,C++看到了age的使用,然后需要决定做什么。它不知道稍后将定义的 Mum class 也会独立创建一个名为 ageprotected int。相反,它看到 ageDad 中定义并说 "oh, that must be what age refers to" 并使用该值。结果,当你打电话给

   m.print_age();

您在 Dad 中看到 age 的值,而不是 Mumage 的值。因为print_age的代码写在Dadclass里,在Mum.

里看不到任何东西

如果您想让 Mum 达到 59 岁,您可以这样做:

  class Mum : public Dad
  {
  public:
     Mum() {
        age = 54;
     }
  };

在这里,构造函数说 "when you create a Mum object, go find the age data member and set it equal to 54." 这意味着只有一个 age 变量,默认为 59 但在 Mum 构造函数中明确设置为 54。现在,调用 print_age 将打印出 54,因为 Dad::print_age 的代码查看刚刚设置的 age 变量。

希望对您有所帮助!