You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用基类隐藏函数会使用派生类的变量?

问题解析:基类成员函数调用为何使用修改后的派生类对象的x值?

你的核心疑问是:明明调用了基类的disp()函数,却输出了派生类对象中修改后的x值(100),而非基类的初始值10。原因可以从以下几点拆解:

1. 派生类并未定义独立的x成员

你的derived类中没有重新声明int x,所以它完全继承了基类base的x成员。此时d1.x = 100的操作,本质是直接修改了d1这个派生类对象里基类子对象的x值——也就是说,这个x和基类里的x是同一个东西,只是通过派生类对象访问而已。

2. 基类成员函数的执行上下文是当前对象

当你用d1.base::disp()调用基类版本的disp()时,只是指定了要调用的函数是基类的实现,但函数的执行仍然是在d1这个派生类对象的上下文中进行的。基类的disp()访问的x,是当前对象(d1)所属的基类子对象中的x,而这个值已经被你改成100了,所以输出自然是100。

验证:让派生类拥有独立的x

如果想要让基类和派生类各自拥有独立的x,只需要在derived类中重新定义x成员,此时派生类的x会隐藏基类的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:
    int x = 20; // 派生类定义独立的x,隐藏基类成员
    void disp() {
        cout<< "disp in derived, x = " << x << endl;
    }
};

int main() {
    derived d1;
    d1.x = 100; // 修改的是派生类自己的x
    d1.base::disp(); // 访问基类子对象的x,输出初始值10
    return 0;
}

这段代码的输出会是你预期的disp in base, x = 10,因为此时基类和派生类的x是两个独立的成员。


内容的提问来源于stack exchange,提问作者Satish Kumar Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:01:35