为什么派生对象不会在派生类中调用重新定义的函数?

时间:2014-10-28 19:58:47

标签: c++ function class object

考虑这种情况: 类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();

2 个答案:

答案 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::yx调用d.BaseClass::y()

为了从派生类的实例调用重写的基类虚方法,必须使用完全限定的方法名称:x,如果没有覆盖{{1},在您的情况下肯定是不可能的在DerivedClass

我理解你的问题了吗?

答案 1 :(得分:0)

如果对象具有静态类型(引用)D,则将调用D::y。如果它具有静态类型(引用)BaseClass,则将调用BaseClass:y。就这么简单。