[英]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 签名在Base
和Derived
class 中匹配。 如果签名不匹配,那么这只会是重新定义,在这种情况下,它将隐藏Derived
class 中的Base::f()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.