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 {
// 转换失败,处理错误情况
}
总之,要避免基类切割问题,关键是要理解面向对象编程中的多态概念,并在编码时尽量使用指针、引用或智能指针来操作对象。