c – 基类指针vs继承类指针?

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

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

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

解决方法:

对于类型检查的所有目的,编译器将a视为可以指向任何Animal,即使您知道它指向Dog:

>你不能传递给期待狗*的功能.
>你不能做a-> fetchStick(),其中fetchStick是Dog的成员函数,但不是Animal的成员函数.
> Dog * d2 = dynamic_cast< Dog *>(d)可能只是编译器上的指针副本. Dog * d3 = dynamic_cast< Dog *>(a)可能不是(我在这里推测,我不打算检查任何编译器.重点是:编译器可能对a和d做出不同的假设转换代码时).
>等

您可以通过其中任何一个调用Dynamic的虚函数(即定义的多态接口),效果相同.假设Dog还没有隐藏它们(好的一点,JaredPar).

对于在Animal中定义的非虚函数,以及在Dog中定义(重载)的非虚函数,通过a调用该函数与通过d调用它不同.

上一篇:c-为在C中实现多态性是否需要分配不兼容的指针


下一篇:php – Laravel多态关系:将模型传递给控制器