为什么要使用“this”指针来调用派生类成员函数?

4

在阅读有关虚函数的教程时(与本例不相关)链接上,我发现了这段代码。

class Weapon
{
    public:
      void features()
         { cout << "Loading weapon features.\n"; }
};



class Bomb : public Weapon
{
    public:
       void features()
         { 
            this->Weapon::features(); 
            cout << "Loading bomb features.\n"; 
         }
};

类 Weapon 派生自类 Bomb,Weapon 的成员函数被调用。

为什么要使用 "this" 指针调用函数 Weapon::features() 呢?这不是已经隐式给出了吗?


9
这是个人风格问题。有些程序员会使用this->来访问成员,而有些则不会。 - Some programmer dude
1
只有在基类和派生类都是模板且基类模板参数依赖于派生类模板参数的罕见情况下才需要使用 this->。但在这里它是无用的。 - HolyBlackCat
5
有人可能会认为Weapon::features()看起来太像调用静态方法了,这是在使用前置this->的一个很好的理由。不过,这只是一种风格上的问题。 - 463035818_is_not_a_number
2
@HolyBlackCat 基类不必是一个模板,但必须依赖于(或成为)派生类的模板参数。 - Quentin
你可以感觉到他至少花了15分钟的时间才弄清楚这个问题。像__super这样的扩展关键字很不错,但不太可能被采用 :) - Hans Passant
1个回答

4
< p > 这里的“this”是隐含的,在写代码时,是否需要显式地写出它通常是一个风格问题。对于您的情况,我认为明确写出它并不能提高可读性。

然而,在其他情况下,显式地写出“this”才是有意义的,甚至是必要的,以避免本地变量和数据成员之间的名称冲突。例如,考虑下面的程序:

class SomeClass {
public:
    void print(int amount) const {
        cout << amount << endl;
    }
    int amount = 10;
};

int main() {
    SomeClass c;
    c.print(20);
}

输出是20,如果想要访问数据成员,则需要编写cout << this->amount << endl。是的,这可能是不好的风格,但从技术角度来看,有时甚至需要显式使用this

1
顺便提一下,参数/字段名称冲突就是为什么一些标准建议在字段名称末尾添加下划线的原因- https://google.github.io/styleguide/cppguide.html#Variable_Names - Adam Kotwasinski
有没有这样的情况,需要使用this指针来调用成员函数? - elFreak
1
不,成员函数调用总是隐藏具有相同名称/参数集的“全局”函数。因此,对于成员函数来说,使用this关键字在技术上是多余的。 - Stephan Lechner

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