2012-07-18 23 views
1

如果我有一个虚拟事件的以下重写:C++基类::方法重写一个虚函数

void derivedClass::method(event) 
{ 

    // my stuff 

    baseClass::method(event); // <-- 

} 

请问// < ---线做了什么?它叫什么?我不认为它会调用基类的方法,因为它是虚拟的(所以没有体)

+0

对不起,我的意思是文本注释 – 2012-07-18 20:42:10

+0

是啊,我意识到之前和删除 – mathematician1975 2012-07-18 20:42:25

+1

一个成员函数是虚拟的,并不意味着它没有定义。即使它是*纯虚拟的*它可以有一个定义,并用该语法来调用。 – 2012-07-18 20:58:24

回答

2

正如你所提出的建议,它调用基类的方法。它是虚拟的这一事实只意味着它可以被覆盖,并仍然可以从指针/引用到基类访问派生类的方法。

之所以这样做,可以很容易地看到一个例子:

class Base { 
public: 
    virtual void foo() { 
     /* do some generic stuff */ 
    } 
}; 

class Derived : public Base { 
public: 
    void foo() { 
     /* do some specific stuff */ 

     /* if you also want to do the generic stuff, 
      you can call the same method from the base class. */ 
     Base::foo(); 
    } 
} 

这可能是你不想做通用的东西为Derived类的情况。然后,您将删除对Base::foo()的呼叫。

在这里,你有virtual methods一个很好的参考。

+0

那么哪种方法实际上会被调用?假设基础上只有一个虚拟方法,并且上面的代码为派生类 – 2012-07-18 20:44:23

+0

@JohnnyPauling首先,派生类中的方法将被调用。然后,由于显式调用了基类的方法,该方法也会被调用。 – betabandido 2012-07-18 20:45:22

+0

谢谢,现在很清楚 – 2012-07-18 20:45:50

1

它确实调用基类方法。是的,衍生的方法是被称为“多晶型”,但它可以调用使用Base::method

1

合格名称(<class name>::<method name>)在一个类的方法调用时,该方法被直接调用其基部方法,非几乎为。在你的例子中,调用baseClass::method。由于使用了限定名称,因此方法是虚拟的这一事实意味着什么都没有,并且没有任何区别。