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

时间:2012-10-24 13:43:26

标签: c++

我如何以及何时调用超类方法?有关这两个选项,请参阅代码段:

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

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

6 个答案:

答案 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->methodsuperClass::method()当在超类中实现方法的一部分并且您希望在派生类中扩展它时,它是有用的。类似的东西:

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

答案 3 :(得分:3)

this->method()在某些情况下会留下歧义的空间(例如,如果有多个祖先使用此签名定义method),但同时允许method被调用,无论在何处确切地说它是定义的。如果methodvirtual,则会调用派生程度最高的版本。

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

答案 4 :(得分:3)

在这个特定的例子中,没有区别。

如果方法是virtual

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

答案 5 :(得分:1)

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