假设我有一个继承自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调用它不同.