我有类Foo
和Bar
,其中Bar继承自Foo。这两个类都有getLength()
方法。我在main中有一个函数,它将超类Foo
对象作为参数,但它通常传递一个Bar
对象。
当Bar
对象通过时,为什么还会调用Foo
getLength()
方法?
答案 0 :(得分:3)
很抱歉,如果这是一个愚蠢的问题,但你是否将getLength()函数标记为“虚拟”? (你需要。)
答案 1 :(得分:3)
如果子类可以覆盖它,则应将方法定义为virtual
。
答案 2 :(得分:2)
您需要在基类中声明方法 virtual
。
请记住,任何虚方法的类都应该有一个虚析构函数。
这里有很多信息:http://www.parashift.com/c++-faq-lite/virtual-functions.html
答案 3 :(得分:1)
您需要将方法声明为虚拟。
class Foo
{
virtual double getLength();
}
答案 4 :(得分:1)
当然,每个人都是对的,因为你需要将这个功能标记为虚拟。但为什么会这样呢?
在C ++中,使用类型的引用在编译时解析非虚函数调用,而不是对象的实际类型。所以这就是为什么在你的情况下调用Foo :: getLength()函数 - 你的函数被声明为使用Foo。
但是,如果将函数声明为虚函数,则对象的实际类型将确定调用哪个函数。
阅读virtual functions section of the C++ FAQ了解所有血腥细节。
(将此场景与Java之类的语言进行对比,默认情况下实例方法是虚拟的。)
答案 5 :(得分:0)
你必须将Foo的getLength()函数声明为虚拟。请通过以下链接获取有关虚拟功能,隐藏虚拟化,虚拟表等的说明 [http://www.learncpp.com/cpp-tutorial/122-virtual-functions/]
答案 6 :(得分:0)
当然还有面试问题,其中一个被宣布为const而另一个没有!
答案 7 :(得分:0)
getLength()声明中需要“virtual”关键字。并记住在每个类中创建虚拟析构函数以正确释放资源。因为如果使用指向派生的基类的指针并调用非虚拟析构函数,则只会调用基类析构函数。如果添加虚拟析构函数,则首先调用派生类析构函数,然后调用基类析构函数。当您在派生类中获取额外资源并且需要首先释放它时,它很有用。基类析构函数无法创建它,因为它不了解额外的资源。