一.dynamic_cast函数介绍
在C++11中,可以使用
dynamic_cast
进行带虚函数的基类指针到子类指针的转换。dynamic_cast:主要用于基类和派生类之间的向下转型,它会在运行时检查转换的安全性。
二. 基类指针和子类指针之间的转换
(1)基类指针转换为子类指针示例代码:
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print() override {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Base baseObj;
Derived* derivedPtr = dynamic_cast<Derived*>(&baseObj); // 基类指针转换为子类指针
if (derivedPtr != nullptr) {
derivedPtr->print(); // 调用派生类的print函数
} else {
std::cout << "Conversion failed" << std::endl;
}
return 0;
}
在上面的代码中,我们定义了一个名为
Base
的基类和一个名为Derived
的派生类。然后,我们创建了一个名为baseObj
的Base
类对象。接下来,使用dynamic_cast
将&baseObj
转换为Derived
类的指针,并将结果存储在名为derivedPtr
的派生类指针变量中。最后,通过derivedPtr
调用派生类的
运行结果:
这表明基类指针无法成功转换为子类指针,因为
baseObj
实际上是一个Base
对象而不是Derived
对象。
(2)子类指针转换为基类指针示例代码:
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print() override {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Derived derivedObj;
Base* basePtr = dynamic_cast<Base*>(&derivedObj); // 子类指针转换为基类指针
if (basePtr != nullptr) {
basePtr->print(); // 调用基类的print函数
} else {
std::cout << "Conversion failed" << std::endl;
}
return 0;
}
在上面的代码中,我们定义了一个名为
Base
的基类和一个名为Derived
的派生类。然后,我们创建了一个名为derivedObj
的Derived
类对象。接下来,使用dynamic_cast
将&derivedObj
转换为Base
类的指针,并将结果存储在名为basePtr
的基类指针变量中。最后,通过basePtr
调用基类的
运行结果:
这表明子类指针成功转换为基类指针,并调用了派生类的