考虑这种情况: 类BaseClass定义函数x()和y()。 x()调用y()。
类DerivedClass继承自BaseClass并重新定义函数y()。
创建DerivedClass类的对象D并调用函数x()。
当调用x()时,使用y(),在BaseClass中定义的那个还是DerivedClass中重新定义的那个?
对象D在BaseClass中调用函数X() 函数X()调用BaseClass中的函数Y()而不调用DerivedClass中的函数Y()
函数调用在编译时绑定 这是静态绑定。
我不清楚为什么会出现问题。如果函数X被调用(由对象D)并且对象D是派生类,那么它是不是只调用重新定义的类的D.Y()?
这是我给出的样本,我正试图理解。
baseClass
void x(); // calls y();
void y();
derivedClass
void y();
main()
derivedClass D;
D.x();
答案 0 :(得分:2)
我的C ++生锈了,但我会试一试:
您的代码应该是以下
class BaseClass
{
public:
void x() {
this->y();
}
protected:
void y() {
/* do stuff */
}
};
class DerivedClass : public BaseClass
{
protected:
void y() {
/* do different stuff */
}
};
int main() {
DerivedClass d;
d.x();
}
如果y
中的BaseClass
在其定义中变为虚拟,那么它就是在执行DerivedClass::y
时调用的重写方法d.x()
(其中d
是一个DerivedClass
实例。
要使y
为虚拟,请使用virtual
关键字,如下所示:
virtual void y() { /* do stuff */ }
如果未使用y
中的virtual
关键字定义BaseClass
,则BaseClass::y
会x
调用d.BaseClass::y()
。
为了从派生类的实例调用重写的基类虚方法,必须使用完全限定的方法名称:x
,如果没有覆盖{{1},在您的情况下肯定是不可能的在DerivedClass
。
我理解你的问题了吗?
答案 1 :(得分:0)
如果对象具有静态类型(引用)D,则将调用D::y
。如果它具有静态类型(引用)BaseClass,则将调用BaseClass:y
。就这么简单。