c++ 为什么隐藏函数是使用派生类变量的?

axzmvihb  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(146)

这是一个非常基本的程序,但我认为有必要澄清我的疑问。
以下程序的输出为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;
}
lrpiutwd

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成员,你需要在派生类中声明该成员,如下所示:

class derived : public base {
public:
    int x = 10; // Gives "derived" its own "x", which hides the base class member
    void disp() {
        cout << "disp in derived, x = " << x << endl;
    }
};

修改后,d1.base::disp();调用将显示10,这是基类成员变量的(未修改的)值,因为d1.x = 100;行现在修改了派生类的 * 完全不同的 * x成员。
注意,隐藏这样的数据成员被许多C++程序员认为是不好的做法。

cqoc49vn

cqoc49vn2#

根据我的理解如果你在你的main方法中添加下面这行代码,

d1.disp();

您将获得以下输出,

disp in base, x = 100
disp in derived, x = 100

从我能看出的是,因为基类中的变量x是公共的,派生类继承了那个变量,因此,当你把x设置为一个值时,你改变了派生类中的变量,这和基类中的变量是一样的,这就是我能看出的。

相关问题