C++中的基類切割問題(Base Class Slicing)是指當一個派生類對象被賦值給一個基類對象時,派生類中的成員變量會被切割掉,只留下基類部分
class Base { /* ... */ };
class Derived : public Base { /* ... */ };
Derived d;
Base* b = &d; // 正確,沒有切割問題
std::shared_ptr
和std::unique_ptr
,它們可以自動管理內存,并且可以配合多態使用。#include<memory>
class Base { /* ... */ };
class Derived : public Base { /* ... */ };
std::shared_ptr<Derived> d = std::make_shared<Derived>();
std::shared_ptr<Base> b = d; // 正確,沒有切割問題
class Base {
public:
virtual void foo() { /* ... */ }
};
class Derived : public Base {
public:
void foo() override { /* ... */ }
};
Derived d;
Base* b = &d;
b->foo(); // 調用的是Derived類的foo()方法
dynamic_cast
:在運行時檢查類型轉換是否安全。如果轉換不安全,dynamic_cast
將返回空指針。class Base { /* ... */ };
class Derived : public Base { /* ... */ };
Derived d;
Base* b = &d;
Derived* d_ptr = dynamic_cast<Derived*>(b);
if (d_ptr != nullptr) {
// 轉換成功,可以繼續操作
} else {
// 轉換失敗,處理錯誤情況
}
總之,要避免基類切割問題,關鍵是要理解面向對象編程中的多態概念,并在編碼時盡量使用指針、引用或智能指針來操作對象。