2011-02-01 76 views
1

我有类FooBar,其中Bar从Foo继承。这两个类都有一个getLength()方法。我有一个主函数,它以超类Foo对象作为参数,但它通常会传递一个Bar对象。调用子类的方法

Bar对象被传递时,为什么它仍然调用FoogetLength()方法?

+1

getLength()在你的Foo类中声明了`virtual`吗? – RageD 2011-02-01 02:24:59

+1

发布您的代码。 – 2011-02-01 02:25:06

回答

3

对不起,如果这是一个愚蠢的问题,但你把getLength()函数标记为“虚拟”? (您需要)

3

如果子类可能会覆盖它,您应该将您的方法定义为virtual

1

您需要声明的方法虚拟

class Foo 
    { 
     virtual double getLength(); 
    } 
1

当然,每个人都是对的,因为您需要将该功能标记为虚拟。但为什么会这样呢?

在C++中,非虚函数调用在编译时使用类型的参考来解析,而不是实际的对象类型。所以这就是为什么在你的情况下,Foo :: getLength()函数被称为—你的函数被声明为使用Foo。

但是,如果将函数声明为虚函数,那么对象的实际类型将决定调用哪个函数。

阅读virtual functions section of the C++ FAQ了解所有血淋淋的细节。

(对比度这种情况下,以Java等语言,其中实例方法是通过默认虚拟)

0

您必须声明Foo的的getLength()函数为虚拟的。请通过下面的链接来获得有关虚拟功能,隐藏虚拟化,虚拟桌面等的说明。

0

当然还有面试问题的一个被宣布为const而另一个不是!

0

getLength()声明中需要“虚拟”关键字。并且想起在每个类中创建虚拟析构函数来正确释放资源。因为如果您使用指向派生的基类的指针并调用非虚析构函数,则只会调用基类析构函数。如果添加虚拟析构函数,那么将首先调用派生类析构函数,然后调用基类析构函数。当您在派生类中获取额外的资源并需要首先释放它时,它是有用的。基类析构函数不能生成它,因为它不知道额外的资源。