这是一个非常基本的程序,但我认为有必要澄清我的疑问。
以下程序的输出为disp in base,x = 100。
在下面的程序中,我只是在派生类对象中设置x
的值,而派生类对象是从基类继承的。在基类中,x
是用值10
初始化的。我不明白的是,当我使用语法**d1.base::disp()**调用函数disp
时,它如何将派生类中的x
的值带入基类的函数中?我希望它显示10
来代替x
。
我是不是漏掉了什么概念?
#include<iostream>
using namespace std;
class base {
public:
int x = 10;
void disp() {
cout<< "disp in base, x = " << x << endl;
}
};
class derived : public base {
public:
void disp() {
cout<< "disp in derived, x = " << x << endl;
}
};
int main() {
derived d1;
d1.x = 100;
d1.base::disp();
return 0;
}
2条答案
按热度按时间lrpiutwd1#
是的。尽管你的派生类
disp()
函数隐藏了基类中具有相同签名的函数,但是它使用了与基类相同的x
成员变量。这就是继承的工作方式:未被派生类覆盖(或隐藏)的函数和数据是从基类"继承“的;在内部,作为其存储器布局的一部分,X1 M2 N1 X对象将具有 * 实际 * X1 M3 N1 X对象,并且如果相关的访问属性(即,X1 M4 N1 X或X1 M5 N1 X,而不是X1 M6 N1 X)被给予那些成员,则该类将具有对该基类的成员的访问。在你的代码中,派生类并不隐藏/隐藏基类
x
成员,所以它使用相同的变量。为了使派生类和基类拥有独立的(即不同的)x
成员,你需要在派生类中声明该成员,如下所示:修改后,
d1.base::disp();
调用将显示10
,这是基类成员变量的(未修改的)值,因为d1.x = 100;
行现在修改了派生类的 * 完全不同的 *x
成员。注意,隐藏这样的数据成员被许多C++程序员认为是不好的做法。
cqoc49vn2#
根据我的理解如果你在你的main方法中添加下面这行代码,
您将获得以下输出,
从我能看出的是,因为基类中的变量x是公共的,派生类继承了那个变量,因此,当你把x设置为一个值时,你改变了派生类中的变量,这和基类中的变量是一样的,这就是我能看出的。