C++入门——60s从0到1
基类与派生类的转换
在C++中,基类和派生类之间可以进行类型转换。这种转换是通过动态类型转换(也称为多态)来实现的。
基类指针或引用与派生类对象的转换
如果一个基类指针或引用指向一个派生类对象,可以通过强制类型转换将其转换为派生类类型的指针或引用。
#include <iostream> using namespace std; class Base { public: virtual void func() { cout << "Base::func()" << endl; } }; class Derived : public Base { public: void func() { cout << "Derived::func()" << endl; } }; int main() { // 基类指针指向派生类对象 Base* ptr = new Derived(); ptr->func(); // 调用 Derived::func() // 将基类指针转换为派生类引用 Derived& ref = *static_cast<Derived*>(ptr); ref.func(); // 调用 Derived::func() delete ptr; return 0; }
在上面的例子中,我们创建了一个指向 `Derived` 对象的 `Base` 类型的指针 `ptr`。然后,我们通过强制类型转换将 `ptr` 从 `Base*` 转换为 `Derived*`,并将其赋值给 `Derived&` 类型的变量 `ref`。这样,我们就可以通过 `ref` 来调用 `Derived` 类型的成员函数 `func()`。
需要注意的是,如果基类没有虚函数,那么将无法通过基类指针或引用访问派生类的成员函数。因为编译器无法确定应该调用哪个函数,所以会引发编译错误。因此,在使用基类和派生类的转换时,通常需要将基类的虚函数声明为虚函数。
派生类对象与基类对象的转换
如果一个派生类对象可以被强制类型转换为一个基类类型的对象,那么这个派生类对象就可以被当作一个基类对象来处理。但是需要注意的是,这种强制类型转换可能会导致一些信息丢失。因为将一个派生类对象降级为一个基类对象后,它就失去了所有在派生类中新增的属性和行为。
#include <iostream> using namespace std; class Base { public: virtual void func() { cout << "Base::func()" << endl; } }; class Derived : public Base { public: void func() { cout << "Derived::func()" << endl; } }; int main() { // 将派生类对象降级为基类对象 Base b = static_cast<Base&>(d); // 强制类型转换为 Base&,而不是 Base* b.func(); // 调用 Base::func() return 0; }
在上面的例子中,我们将一个 `Derived` 对象 `d` 通过强制类型转换降级为一个 `Base` 类型的对象 `b`。然后我们调用了 `b.func()`,由于 `Base` 的 `func()` 是虚函数,所以这里会调用 `Derived` 的 `func()` 函数。但是需要注意的是,此时我们已经将 `d` 的类型降为了 `Base`,所以它失去了所有在 `Derived` 中新增的属性和行为。