具有继承层次结构的动态转换

时间:2020-04-24 18:14:00

标签: c++ casting

所以我有这个代码:

Base* objbase = new Derived();

//perform a downcast at runtime with dynamic_cast
Derived* objDer = dynamic_cast<Derived*>(objBase);

if(objDer)//check for success of the cast
    objDer->CallDerivedFunction();

这是我书中演员转换部分的代码片段。

现在为什么要拥有这个,我不明白必须动态地将指向基础对象的指针强制转换为指向派生对象的意义;对我来说,这与多态有关,它使我们能够执行objBase->DeriveClassFunction(),但我真的不知道。

首先要这样做:Base* objbase = new Derived();,然后为什么要再次将基础对象指针转换为“派生”,所以我不知道为什么。

谢谢。

1 个答案:

答案 0 :(得分:2)

该代码段只是对可能的演示。它描述了一种工具,您可以自行决定如何使用该工具。一个更大的例子可能是:

class Animal {
    void Feed();
};
class Cat : public Animal { /*...*/ };
class Dog : public Animal {
    // Only dogs need to go out for a walk
    void WalkTheDog();
};

void Noon(Animal* pet)
{
    // No matter what our pet is, we should feed it
    pet->Feed();

    // If our pet is a dog, we should also take it out at noon
    Dog* dog = dynamic_cast<Dog*>(pet);
    if(dog) // Check if the cast succeeded
        dog->WalkTheDog();
}

Noon(new Cat()); // Feed the cat
Noon(new Dog()); // Feed the dog and take him out

请注意,每只动物都具有Feed()函数,但只有狗具有WalkTheDog()函数,因此要调用该函数,我们需要有一个指向狗的指针。但是同时复制两种类型的Noon()函数也很浪费,特别是如果我们以后可能要添加更多的动物的时候。因此,Noon()函数可用于任何种类的动物,并且仅在该动物实际上是狗的情况下才执行特定于狗的事情。

相关问题