如果我有一个虚拟事件的以下重写:C++基类::方法重写一个虚函数
void derivedClass::method(event)
{
// my stuff
baseClass::method(event); // <--
}
请问// < ---线做了什么?它叫什么?我不认为它会调用基类的方法,因为它是虚拟的(所以没有体)
如果我有一个虚拟事件的以下重写:C++基类::方法重写一个虚函数
void derivedClass::method(event)
{
// my stuff
baseClass::method(event); // <--
}
请问// < ---线做了什么?它叫什么?我不认为它会调用基类的方法,因为它是虚拟的(所以没有体)
正如你所提出的建议,它调用基类的方法。它是虚拟的这一事实只意味着它可以被覆盖,并仍然可以从指针/引用到基类访问派生类的方法。
之所以这样做,可以很容易地看到一个例子:
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一个很好的参考。
那么哪种方法实际上会被调用?假设基础上只有一个虚拟方法,并且上面的代码为派生类 – 2012-07-18 20:44:23
@JohnnyPauling首先,派生类中的方法将被调用。然后,由于显式调用了基类的方法,该方法也会被调用。 – betabandido 2012-07-18 20:45:22
谢谢,现在很清楚 – 2012-07-18 20:45:50
它确实调用基类方法。是的,衍生的方法是被称为“多晶型”,但它可以调用使用Base::method
当合格名称(<class name>::<method name>
)在一个类的方法调用时,该方法被直接调用其基部方法,非几乎为。在你的例子中,调用baseClass::method
。由于使用了限定名称,因此方法是虚拟的这一事实意味着什么都没有,并且没有任何区别。
对不起,我的意思是文本注释 – 2012-07-18 20:42:10
是啊,我意识到之前和删除 – mathematician1975 2012-07-18 20:42:25
一个成员函数是虚拟的,并不意味着它没有定义。即使它是*纯虚拟的*它可以有一个定义,并用该语法来调用。 – 2012-07-18 20:58:24