我将如何以及何时调用超类方法?两个选项请参考代码段:
class SuperClass {
public:
void method();
};
class SubClass : public SuperClass {
public:
void someOtherMethdo(){
this->method();
SuperClass::method();
}
};
我将如何以及何时调用超类方法?两个选项请参考代码段:
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
调用,无论它在哪里定义。如果method
是virtual
,它将调用最衍生的版本。
SuperClass::method()
是明确的。它将调用该特定方法或给出编译器错误。
在这个特定的例子中,没有区别。
如果方法是virtual
:
this->method()
将动态调用函数(调用类的最高实现版本)SuperClass::method()
导致静态调用。this->method();
在您的情况下调用父级,或者如果它是虚拟的 - 调用 vtable 中已实现函数的顶部。SuperClass::method();
将调用父母的方法。