繁体   English   中英

Const改变变量值

[英]Const changing variable values

我有一个在超类中看起来像这样的虚拟get方法:

virtual double getPortagem() const;    
double via_Ligacao::getPortagem() const
 {
    return 0;
 }

并在他们的“孩子”:

double getPortagem();
double auto_Estrada::getPortagem()
{
    return portagem;
}

困扰我的是如果我将子方法声明为非const,结果将根据插入的值进行处理,但如果我声明为const方法,它将返回一个内存位置。 你能解释一下这个吗?

函数重写没有完成,因为你在子类中创建一个新函数,通过声明非const函数,它与超类中的函数没有任何匹配。

在C ++ 11中,您可以使用关键字override来确保预期的覆盖确实是覆盖:

double auto_Estrada::getPortagem() override
{
    return portagem;
}

如果它不是覆盖,那么你得到一个编译错误,这个非const函数不是(因为它的const -ness与同名的基类方法不同)。

而不是覆盖基类函数,这个函数会影响基类函数,所以如果你调用o.getPortagem() ,其中oconst和类auto_Estrada ,编译器将找不到基类const函数,并抱怨。

在C ++ 03中,您可以做的最好的事情是静态断言可以使用相同的参数调用相同的命名基类函数(它有帮助,但不能保证)。 请注意,C ++ 03没有static_assert 执行C ++ 03静态断言的常用方法是通过数组的typedef,其中负大小需要编译时错误。


关于术语,

你称之为“子类”的是派生类 (C ++术语)或子类 (更通用的计算机科学术语,我相信最初来自Smalltalk),

你所谓的“内存位置”似乎是未初始化变量中的任意位,被解释为浮点值,称为不确定值

它是使用不确定值的正式未定义行为,因此任何事情都可能发生。

暂无
暂无

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

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