调用子类的方法

时间:2011-02-01 02:22:24

标签: c++ inheritance

我有类FooBar,其中Bar继承自Foo。这两个类都有getLength()方法。我在main中有一个函数,它将超类Foo对象作为参数,但它通常传递一个Bar对象。

Bar对象通过时,为什么还会调用Foo getLength()方法?

8 个答案:

答案 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”关键字。并记住在每个类中创建虚拟析构函数以正确释放资源。因为如果使用指向派生的基类的指针并调用非虚拟析构函数,则只会调用基类析构函数。如果添加虚拟析构函数,则首先调用派生类析构函数,然后调用基类析构函数。当您在派生类中获取额外资源并且需要首先释放它时,它很有用。基类析构函数无法创建它,因为它不了解额外的资源。