c++ dynamic_cast 例子
时间: 2023-07-23 09:03:56 浏览: 97
c++ dynamic_cast与static_cast使用方法示例
假设我们有一个基类 `Animal` 和两个派生类 `Dog` 和 `Cat`,代码如下:
```cpp
class Animal {
public:
virtual ~Animal() {}
};
class Dog : public Animal {
public:
void bark() { std::cout << "Woof!" << std::endl; }
};
class Cat : public Animal {
public:
void meow() { std::cout << "Meow!" << std::endl; }
};
```
我们可以使用 `dynamic_cast` 运算符来在运行时将一个指向基类对象的指针转换为指向其派生类对象的指针。假设我们有一个指向基类对象的指针 `ptr`,我们可以检查它是否指向派生类 `Dog`,并调用 `Dog` 的成员函数 `bark()`,代码如下:
```cpp
Animal* ptr = new Dog();
Dog* dog_ptr = dynamic_cast<Dog*>(ptr);
if (dog_ptr) {
dog_ptr->bark();
}
```
在这个例子中,我们首先将 `ptr` 初始化为指向 `Dog` 对象的指针,然后使用 `dynamic_cast` 将其转换为 `Dog*` 类型。如果转换成功,则 `dog_ptr` 指向同一个 `Dog` 对象,我们可以安全地调用 `bark()` 函数。
如果 `ptr` 指向的是 `Cat` 对象,那么 `dynamic_cast` 就会返回一个空指针,我们可以使用 `nullptr` 来检查转换是否成功。例如,假设我们有一个指向 `Cat` 对象的指针 `ptr`,我们可以检查它是否指向 `Dog`,并调用 `Dog` 的成员函数 `bark()`,代码如下:
```cpp
Animal* ptr = new Cat();
Dog* dog_ptr = dynamic_cast<Dog*>(ptr);
if (dog_ptr) {
dog_ptr->bark(); // 这里不会执行,因为 dog_ptr 是一个空指针
} else {
std::cout << "ptr does not point to a Dog object" << std::endl;
}
```
在这个例子中,`dynamic_cast` 返回一个空指针,因为 `ptr` 指向的是 `Cat` 对象而不是 `Dog` 对象。我们可以检查 `dog_ptr` 是否为空来确定转换是否成功。在这个例子中,`dog_ptr` 是一个空指针,因此我们输出一条消息来说明 `ptr` 并不指向 `Dog` 对象。
阅读全文