繁体   English   中英

为什么在虚拟 function 声明中使用不同的返回类型会引发错误而不是导致重新定义?

[英]Why using a different return type in virtual function declaration throws an error instead of resulting in a redefinition?

底座 class:

class Base
{
    public:
        virtual int f() const
        {
            return 1;
        }
};

派生 class:

class Derived: public Base
{
    public:
        void f() const {}
};

上面的代码抛出“返回类型不相同/协变错误”。

我读过一些关于它的讨论。 这个类似,但他们只说如果返回类型不同/协变,它将破坏代码。 用不同的返回类型覆盖成员 function

为什么我期望的行为没有发生?

预期行为:Derived 中的 VPTR 指向 Base::f() (我读过如果没有为虚拟 function 提供覆盖,派生对象将只使用继承的 class 版本)。 它还隐藏了名称 f() 所以现在这样的调用:

Derived x;
x.f();

应该调用 Derived::f() 和这样的调用:

x.Base::f();

应该调用 Base::f() function。 这似乎不像破坏代码。 万一它被升级了,即使那样它也不应该破坏代码,因为两个类的 VPTR 都指向同一个 Base::f()

我能想到的唯一原因是这样的声明(相同的签名和协变/相同的返回类型)被保留用于覆盖虚拟方法,我们不能使用它来导致我期望的行为。

当编译器遇到匹配的签名(参数、常量)时,它会自动将void f() const声明变为虚拟。 所以Derived的定义解释为:

class Derived: public Base
{
    public:
        virtual void f() const {} // virtual keyword is added
};

它显然看起来像是试图覆盖Base::f() 这一切都是因为 function 签名在BaseDerived class 中匹配。 如果签名不匹配,那么这只会是重新定义,在这种情况下,它将隐藏Derived class 中的Base::f()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM