我有类Foo
和Bar
,其中Bar从Foo继承。这两个类都有一个getLength()
方法。我有一个主函数,它以超类Foo
对象作为参数,但它通常会传递一个Bar
对象。调用子类的方法
当Bar
对象被传递时,为什么它仍然调用Foo
getLength()
方法?
我有类Foo
和Bar
,其中Bar从Foo继承。这两个类都有一个getLength()
方法。我有一个主函数,它以超类Foo
对象作为参数,但它通常会传递一个Bar
对象。调用子类的方法
当Bar
对象被传递时,为什么它仍然调用Foo
getLength()
方法?
对不起,如果这是一个愚蠢的问题,但你把getLength()函数标记为“虚拟”? (您需要)
如果子类可能会覆盖它,您应该将您的方法定义为virtual
。
您需要在基类中声明方法virtual
。
请记住,任何虚拟方法的类也应该有一个虚拟析构函数。
此信息充沛:http://www.parashift.com/c++-faq-lite/virtual-functions.html
您需要声明的方法虚拟。
class Foo
{
virtual double getLength();
}
当然,每个人都是对的,因为您需要将该功能标记为虚拟。但为什么会这样呢?
在C++中,非虚函数调用在编译时使用类型的参考来解析,而不是实际的对象类型。所以这就是为什么在你的情况下,Foo :: getLength()函数被称为—你的函数被声明为使用Foo。
但是,如果将函数声明为虚函数,那么对象的实际类型将决定调用哪个函数。
阅读virtual functions section of the C++ FAQ了解所有血淋淋的细节。
(对比度这种情况下,以Java等语言,其中实例方法是通过默认虚拟)
您必须声明Foo的的getLength()函数为虚拟的。请通过下面的链接来获得有关虚拟功能,隐藏虚拟化,虚拟桌面等的说明。
当然还有面试问题的一个被宣布为const而另一个不是!
getLength()声明中需要“虚拟”关键字。并且想起在每个类中创建虚拟析构函数来正确释放资源。因为如果您使用指向派生的基类的指针并调用非虚析构函数,则只会调用基类析构函数。如果添加虚拟析构函数,那么将首先调用派生类析构函数,然后调用基类析构函数。当您在派生类中获取额外的资源并需要首先释放它时,它是有用的。基类析构函数不能生成它,因为它不知道额外的资源。
getLength()在你的Foo类中声明了`virtual`吗? – RageD 2011-02-01 02:24:59
发布您的代码。 – 2011-02-01 02:25:06