继承分层的动态铸造

问题描述 投票:1回答:1

所以我有这段代码。

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();然后为什么它又把一个基对象指针投到一个派生对象上, 我不太明白为什么.

先谢谢你了。

c++ casting
1个回答
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()函数 所以为了调用这个函数 我们需要一个指向狗的指针(pointer) 但如果为这两种类型复制Noon()函数也是相当浪费的,尤其是当我们以后可能会添加更多的动物时。所以取而代之的是,Noon()函数对任何种类的动物都有效,而且只有在动物真的是狗的情况下才会做狗特有的事情。

© www.soinside.com 2019 - 2024. All rights reserved.