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

C++派生类访问基类成员变量:两种写法的区别及适用场景

this->variable vs Base::variable in Derived Classes

嘿,这个问题问到点子上了——这俩写法在C++继承里的区别,核心是成员查找的作用域优先级,我给你拆解清楚:

核心区别

1. this->variable

this是指向当前Child对象的指针,所以this->variable会按照C++的作用域查找规则来找成员:

  • 先在当前类(Child)的作用域里找有没有叫variable的成员;
  • 如果找不到,再去直接基类(Base)的作用域里找;
  • 还找不到的话,继续往上找更上层的基类(如果有的话)。

在你给出的代码里,Child没有自己定义variable,所以this->variable最终会找到Base里的protected成员,和直接写variable效果一样。但如果Child自己也声明了一个同名的variable:

class Child : public Base {
public:
    Child() {}
protected:
    SomeClass variable; // 派生类同名成员
    void method() {
        this->variable; // 这里访问的是Child自己的variable!
    }
};

这时候this->variable就会优先用派生类的成员,也就是所谓的同名隐藏。

2. Base::variable

这是直接用作用域限定符强制指定:我要找的是Base类里的variable成员,完全跳过派生类的作用域查找。不管Child有没有同名成员,都会直接访问Base里的那个variable。比如刚才的例子里,哪怕Child有自己的variable,Base::variable依然会指向基类的版本。

适用场景

什么时候用this->variable?

  • 当你确定派生类没有同名成员,只是想正常访问从基类继承来的成员,写法简洁自然,和直接写variable差别不大(模板类继承里this->有时是必须的,但你的例子不是模板,不用纠结);
  • 当你就是想访问派生类自己定义的同名成员(如果有的话),this->会帮你优先找到派生类的版本。

什么时候用Base::variable?

  • 最常见的场景:派生类有同名成员,而你明确需要访问基类的那个版本,避免被派生类的同名成员隐藏;
  • 在复杂继承结构里,为了让代码更清晰,明确指定要基类的成员,避免阅读代码的人误解你要访问的是哪个成员。

举个你代码里的实际例子:如果Child没有自己的variable,两种写法效果完全一致;但如果以后给Child加了同名成员,this->variable就会指向Child的,而Base::variable还是指向Base的——这就是两者最核心的区别啦。

内容的提问来源于stack exchange,提问作者landigio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:22:39