我有一个在超类中看起来像这样的虚拟get方法:
virtual double getPortagem() const;
double via_Ligacao::getPortagem() const
{
return 0;
}
在他们的“孩子”中:
double getPortagem();
double auto_Estrada::getPortagem()
{
return portagem;
}
让我烦恼的是,如果我将子方法声明为非const,则结果将根据插入的值进行处理,但如果我将其声明为const方法,则会返回一个内存位置。你们能帮我解释一下吗?
答案 0 :(得分:1)
函数重写没有完成,因为你在子类中创建一个新函数,通过声明非const函数,它与超类中的函数没有任何匹配。
答案 1 :(得分:1)
在C ++ 11中,您可以使用关键字 override
来确保预期覆盖确实是覆盖:
double auto_Estrada::getPortagem() override
{
return portagem;
}
如果不是一个覆盖,那么你会得到一个编译错误,这个非const
函数不是(因为它在const
中有所不同 - 来自同名的基类方法)。
而不是覆盖基类函数这个函数阴影基类函数,这样如果你调用o.getPortagem()
o
是{ {1}}和类const
,编译器将找不到基类auto_Estrada
函数,并抱怨。
在C ++ 03中,你可以做的最好的事情是静态断言可以用相同的参数调用相同的命名基类函数(它有帮助,但不能保证)。请注意,C ++ 03没有const
。执行C ++ 03静态断言的常用方法是通过数组的typedef,其中负大小需要编译时错误。
关于术语,
你称之为“子类”的是派生类(C ++术语)或子类(更通用的计算机科学术语,我相信最初来自Smalltalk),< / p>
你所谓的“记忆位置”似乎是未初始化变量中的任意位,被解释为浮点值,称为不确定值。
使用不确定的值是正式的未定义行为,因此任何事情都可能发生。