Superclass :: method或this->方法之间的区别

Bil*_*nks 5 c++

我怎么以及何时会调用超类方法?请参考以下两个选项的代码段:

class SuperClass {
public:
 void method();
};

class SubClass : public SuperClass {
public:
 void someOtherMethdo(){
   this->method();
   SuperClass::method();
 }
};
Run Code Online (Sandbox Code Playgroud)

tom*_*ahh 6

使用this->method()您调用一个函数,该函数可以在您的超类中实现,也可以由您自己的类调用.

使用时superClass::method(),请确保拨打父母实施的呼叫.

#include <iostream>
#include <string>

class A {
    public:
    void func() {
        std::cout << "A func" << std::endl;
    }
};

class B : A {
    public:                                   
    void func() {
        std::cout << "B func" << std::endl;
    }

    void exec() {
        this->func();
        A::func();
    }
};

int main() {
    B b;

    b.exec();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此示例代码将输出

B func
A func
Run Code Online (Sandbox Code Playgroud)


sje*_*397 5

this->method();
Run Code Online (Sandbox Code Playgroud)

...调用method派生类(和简单编写一样method();).这可以从父类调用继承的方法(并在示例中执行),或者它可以在子类中调用重写的版本(如果存在的话,它将调用).

SuperClass::method();
Run Code Online (Sandbox Code Playgroud)

...将始终在父级上调用该方法.当您想要保留和扩展父类方法的功能时,通常在子窗口中使用此语法.例如

Class SubClass: public SuperClass {
  //...
  void method() {
    SuperClass::method();
    //...
  }
};
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在第二种情况下使用第一种语法,您将获得递归.

另请注意,这与virtual方法无关.将方法标记为virtual通过基类指针调用方法时,将调用可用的最派生类方法.在上面的代码中,由于没有涉及基类指针,因此任何方法都是虚拟的也没有区别.