超类::方法或这个>方法的区别
Difference between Superclass::method or this-> 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();
将调用父级的方法。
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 两种访问I2C总线的方法有什么区别?
- 定义类模板构造函数的两种方法之间的区别
- CRTP:为什么获得嵌套类型和派生类的嵌套方法有区别
- 这两种方法有什么区别?
- 以下向 c++ 向量添加元素的方法有什么区别
- 类中私有静态方法和私有方法之间的区别
- 构建对象的方法之间有什么区别
- 这两种方法有什么区别
- 分配指针的方法之间有什么区别?
- 这两种初始化成员变量的方法之间有区别吗?
- C++ 中真实方法和虚拟方法之间的区别
- 两种C++分配方法有什么区别
- 超类::方法或这个>方法的区别
- 基于像素和基于帧的方法之间的区别
- 实例化数组的方法之间的区别
- QObject::connect与connect方法之间的区别
- C/C++环境下符号表与分支/跳转/虚拟方法表的区别
- 这两种输入矢量元素的方法有什么区别?哪个更有效
- 以下4种样式调用其他成员方法有什么区别?