我如何以及何时调用超类方法?有关这两个选项,请参阅代码段:
class SuperClass {
public:
void method();
};
class SubClass : public SuperClass {
public:
void someOtherMethdo(){
this->method();
SuperClass::method();
}
};
答案 0 :(得分: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;
}
此示例代码将输出
B func
A func
答案 1 :(得分:5)
this->method();
...在派生类上调用method
(与简单编写method();
相同)。这可以从父类调用继承的方法(并在示例中执行),或者它可以在子类中调用重写的版本(如果存在的话,将调用它)。
SuperClass::method();
...将始终在父级上调用方法。当您想要保留和扩展父类方法的功能时,通常在子窗口中使用此语法。 E.g。
Class SubClass: public SuperClass {
//...
void method() {
SuperClass::method();
//...
}
};
请注意,如果您在第二种情况下使用第一种语法,那么您将获得递归。
另请注意,这与virtual
方法无关。将方法标记为virtual
意味着,当通过基类指针调用方法时,将调用可用的最派生类方法。在上面的代码中,由于没有涉及基类指针,因此任何方法都是虚拟的都没有区别。
答案 2 :(得分:4)
this->method
首先默认为派生类中的本地实现,如果不存在,则采用超类方法。如果那个不存在,它将给出编译错误。
superClass::method()
将始终指向超类中的方法
在大多数情况下,您需要this->method
。 superClass::method()
当在超类中实现方法的一部分并且您希望在派生类中扩展它时,它是有用的。类似的东西:
Class SubClass : public SuperClass {
public:
void someOtherMethdo(){
SuperClass::someOtherMethdo();
//Rest of the method
}
}
答案 3 :(得分:3)
this->method()
在某些情况下会留下歧义的空间(例如,如果有多个祖先使用此签名定义method
),但同时允许method
被调用,无论在何处确切地说它是定义的。如果method
为virtual
,则会调用派生程度最高的版本。
SuperClass::method()
是明确的。它将调用该特定方法或给出编译器错误。
答案 4 :(得分:3)
在这个特定的例子中,没有区别。
如果方法是virtual
:
this->method()
将动态调用该函数(调用该类的最顶层实现版本)SuperClass::method()
会导致静态通话。答案 5 :(得分:1)
this->method();
在您的情况下调用父级,或者如果它是虚拟的 - 在vtable中调用已实现函数的顶部。 SuperClass::method();
将调用父方法。