超类::方法或这个>方法的区别

Difference between Superclass::method or this-> method

本文关键字:方法 区别 gt 超类      更新时间:2023-10-16

如何以及何时调用超类方法?请参考代码段了解两个选项:

class SuperClass {
public:
void method();
};
class SubClass : public SuperClass {
public:
void someOtherMethdo(){
this->method();
SuperClass::method();
}
};

使用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;
}

此示例代码将输出

B func
A func
this->method();

。在派生类上调用method(与简单地编写method();相同)。这可以调用从父类继承的方法(在示例中也是如此),或者它可以调用子类中的重写版本(如果存在,则会调用)。

SuperClass::method();

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

Class SubClass: public SuperClass {
//...
void method() {
SuperClass::method();
//...
}
};

请注意,如果在第二种情况下使用第一种语法,则会得到递归。

另请注意,这与virtual方法无关。将方法标记为virtual意味着,当通过基类指针调用该方法时,将调用可用的派生最多的类方法。在上面的代码中,任何方法是否是虚拟的都没有区别,因为不涉及基类指针。

this->method

将首先默认为派生类中的本地实现,如果该实现不存在,它将采用超类方法。如果不存在,它将给出编译错误。

superClass::method()

将始终指向超类中的方法

在大多数情况下,您希望this->method.superClass::method()当方法的一部分在超类中实现并且您希望在派生类中扩展它时很有用。 像这样:

Class SubClass : public SuperClass {
public:
void someOtherMethdo(){
SuperClass::someOtherMethdo();
//Rest of the method
}
}

this->method()在某些情况下留下了歧义的空间(例如,如果不止一个祖先使用此签名定义method),但同时允许调用method,无论它定义在哪里。如果methodvirtual它将调用派生最多的版本。

SuperClass::method()是明确的。它将调用该特定方法或给出编译器错误。

在此特定示例中,没有区别。

如果该方法virtual

  • this->method()将动态调用函数(调用类的最顶层实现版本)
  • SuperClass::method()会导致静态调用。
this->method();

在您的情况下调用父级,或者如果它是虚拟的 - 调用 vtable 中已实现函数的顶部。SuperClass::method();将调用父级的方法。