C ++声明

时间:2011-02-06 18:22:41

标签: c++

我有一个类,'Cat'和Cat类的子类'DerivedCat'。 Cat有一个函数meow(),而DerivedCat会覆盖这个函数。

在应用程序中,我声明了一个Cat对象:

Cat* cat;

稍后在应用程序中,我初始化了Cat实例:

cat = new DerivedCat();
  1. 哪个'meow()'被调用?为什么?
  2. 声明像这样的超类类型有什么好处?
  3. 我想要这样做的例子是什么?

2 个答案:

答案 0 :(得分:2)

假设您的意思是Cat * cat;,那取决于喵喵方法是否为虚拟方式:

  • 如果是虚拟的,将使用DerivedCat中的定义。
  • 如果不是虚拟的,将使用Cat中的实现。

在Java中,默认情况下所有非静态方法都是虚拟的。这通常是你想要的。但是,虚方法可以在运行时添加性能开销,以确定要调用哪个实现(例如,vtable中的查找)。即使您从未创建子类,您仍可能需要为此性能开销付费。 C ++的目标之一是生成高性能代码,因此默认情况下所有方法都是非虚拟的。

答案 1 :(得分:1)

您的代码中的

cat不是指针或引用,因此cat = new DerivedCat();会在Cat::operator=(DerivedCat*)上调用cat

因此cat.meow()会调用Cat::meow

OP评论后

编辑

如果cat是指针或引用,则可以指向DerivedCat实例。在这种情况下,如果您调用Cat重载的虚拟 DerivedCat函数,则会调用DerivedCat提供的版本。

多态性(这是你被问到的这个特性)是一件很重要的事情,它是面向对象范式的基础。通过示例解释它并不容易,我建议您在WikipediaC++Faq上阅读相关内容以获取更多实施细节。