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

Why wouldn't a derived object just call a redefined function in the derived class?

本文关键字:派生 定义 函数 对象 调用 为什么      更新时间:2023-10-16

考虑一下这种情况:Class BaseClass定义了函数x()和y()。x()调用y()。

类DerivedClass继承自BaseClass并重新定义函数y()。

创建DerivedClass类的对象D,并调用函数x()。

当调用x()时,使用的是BaseClass中定义的y()还是DerivedClass中重新定义的y?

对象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();

我的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中的定义中是虚拟的,则它是在执行d.x()时调用的覆盖方法DerivedClass::y(其中dDerivedClass实例)。

为了使y虚拟化,请使用virtual关键字,如:

virtual void y() { /* do stuff */ }

如果y不是使用BaseClass中的virtual关键字定义的,则x调用的是BaseClass::y

为了从派生类的实例调用被重写的基类虚拟方法,必须使用完全限定的方法名:d.BaseClass::y(),在您的情况下,如果不重写DerivedClass中的x,这肯定是不可能的。

我完全理解你的问题了吗?

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