Dynami c приведение с иерархиями наследования - PullRequest
1 голос
/ 24 апреля 2020

поэтому у меня есть этот код:

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 Ответ

2 голосов
/ 24 апреля 2020

Этот фрагмент кода является просто демонстрацией того, что возможно. Он описывает инструмент, то, что вы делаете с этим инструментом, зависит от вас. Примером чуть большего размера может быть:

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 () работает для любого вида животных и выполняет только вещи, определенные собакой c, только если животное действительно является собакой.

...