基类指针vs继承类指针? [英] Base class pointer vs inherited class pointer?

查看:113
本文介绍了基类指针vs继承类指针?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个继承自类 Animal 的类 Dog 。这两行代码有什么区别?

Suppose I have a class Dog that inherits from a class Animal. What is the difference between these two lines of code?

    Animal *a = new Dog();
    Dog *d = new Dog();

在一个中,指针用于基类,而在另一个中,指针用于派生类。但这种区别何时变得重要?对于多态,任何一个都可以完全相同,对吧?

In one, the pointer is for the base class, and in the other, the pointer is for the derived class. But when would this distinction become important? For polymorphism, either one would work exactly the same, right?

推荐答案

对于类型检查的所有目的,编译器会处理 a 好像它可以指向任何动物,即使你知道它指向一只狗:

For all purposes of type-checking, the compiler treats a as if it could point to any Animal, even though you know it points to a Dog:


  • 您无法将 a 传递给期望 Dog * 的函数。

  • 你不能 a-> fetchStick(),其中 fetchStick 是一个成员函数但不是动物

  • 狗* d2 = dynamic_cast< Dog *>(d)可能只是编译器上的指针副本。 Dog * d3 = dynamic_cast< Dog *>(a)可能不是(我在这里推测,我不打算检查任何编译器。要点是:编译器在转换代码时可能对 a d 做出不同的假设。

  • 等。

  • You can't pass a to a function expecting a Dog*.
  • You can't do a->fetchStick(), where fetchStick is a member function of Dog but not Animal.
  • Dog *d2 = dynamic_cast<Dog*>(d) is probably just a pointer copy on your compiler. Dog *d3 = dynamic_cast<Dog*>(a) probably isn't (I'm speculating here, I'm not going to bother checking on any compiler. The point is: the compiler likely makes different assumptions about a and d when transforming code).
  • etc.

您可以通过以下方式之一调用Animal的虚函数(即定义的多态接口)他们,具有相同的效果。假设 Dog 还没有隐藏它们(好的一点,JaredPar)。

You can call virtual functions (that is, the defined polymorphic interface) of Animal equally through either of them, with the same effect. Assuming Dog hasn't hidden them, anyway (good point, JaredPar).

对于非虚拟函数在Animal中定义,并在Dog中定义(重载),通过 a 调用该函数与通过 d

For non-virtual functions which are defined in Animal, and also defined (overloaded) in Dog, calling that function via a is different from calling it via d.

这篇关于基类指针vs继承类指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆