5

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

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

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

6 回答 6

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
于 2012-10-24T13:45:11.167 回答
5
this->method();

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

SuperClass::method();

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

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

请注意,如果您在第二种情况下使用第一种语法,您将获得递归。

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

于 2012-10-24T13:47:22.383 回答
4
this->method

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

superClass::method()

将始终指向超类中的方法

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

Class SubClass : public SuperClass {
public:
 void someOtherMethdo(){
   SuperClass::someOtherMethdo();
   //Rest of the method
 }
}
于 2012-10-24T13:46:02.350 回答
3

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

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

于 2012-10-24T13:45:37.193 回答
3

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

如果方法是virtual

  • this->method()将动态调用函数(调用类的最高实现版本)
  • SuperClass::method()导致静态调用。
于 2012-10-24T13:46:28.317 回答
1

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

于 2012-10-24T13:47:38.087 回答