为什么我的继承方法输出的是 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 也会独立创建一个名为 age
的 protected
int
。相反,它看到 age
在 Dad
中定义并说 "oh, that must be what age
refers to" 并使用该值。结果,当你打电话给
m.print_age();
您在 Dad
中看到 age
的值,而不是 Mum
中 age
的值。因为print_age
的代码写在Dad
class里,在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
变量。
希望对您有所帮助!
我正在尝试从 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 也会独立创建一个名为 age
的 protected
int
。相反,它看到 age
在 Dad
中定义并说 "oh, that must be what age
refers to" 并使用该值。结果,当你打电话给
m.print_age();
您在 Dad
中看到 age
的值,而不是 Mum
中 age
的值。因为print_age
的代码写在Dad
class里,在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
变量。
希望对您有所帮助!