为什么隐藏函数使用派生类变量?

3

这是一个非常基础的程序,但我认为有必要澄清我的疑惑。

下面程序的输出是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;
}

3
x在基类中,而不是派生类中。所以我不明白这个问题。 - user17732522
一个derived的实例通过"has-a"从它的基类base获取它的x。这里没有任何魔法。你还期望有什么其他的x呢? - WhozCraig
2
“这里我只是在派生类对象中设置了x的值。”:派生类没有直接的x成员。d1.x指的是基类子对象中的x - user17732522
2个回答

1
这里有一些概念你可能没有理解。虽然你的派生类disp()函数隐藏了基类中具有相同签名的函数,但它使用了与基类相同的x成员变量。这就是继承的工作方式:未被派生类覆盖(或隐藏)的函数和数据从基类中继承;在内部,一个derived对象将拥有一个实际的base对象作为其内存布局的一部分,并且如果相关的访问属性(即protectedpublic,但不是private)赋予这些成员,则该类将可以访问该基类的成员。
在你的代码中,派生类也没有隐藏/遮蔽基类的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++程序员认为是不良实践。


0

从我的理解来看,如果您在主方法中添加以下行:

d1.disp();

您将会得到以下输出:
disp in base, x = 100
disp in derived, x = 100

据我所了解,由于基类中的变量x是公开的,派生类会继承该变量。因此,当您将.setX设置为某个值时,您会更改派生类中的该变量,这与基类中的变量相同。这就是我所能理解的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接