example2_cross_casting_between_sibling_classes.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>

class Animal {
public:
    virtual void speak() = 0;
    virtual ~Animal() {}
};

class Flyable {
public:
    virtual void fly() = 0;
    virtual ~Flyable() {}
};

class Bird : public Animal, public Flyable {
public:
    void speak() override { std::cout << "Chirp" << std::endl; }
    void fly() override { std::cout << "Bird is flying" << std::endl; }
};

int main() {
    Bird* bird = new Bird();
    Animal* animal = bird;

    // Cross-casting from Animal* to Flyable*
    Flyable* flyable = dynamic_cast<Flyable*>(animal);

    if (flyable) {
        flyable->fly();
    } else {
        std::cout << "Cast failed" << std::endl;
    }

    delete bird;
    return 0;
}
Back to dynamic_cast