341 字
2 分钟
10容器继承与切片问题
容器继承与切片问题
C++ 容器(如 std::vector
、std::list
等) 通常存储对象的副本,而非指向对象的指针。因此,当与继承结合使用时,可能导致 切片(Object Slicing) 问题,即仅存储基类部分,丢失派生类特有的信息。为了实现多态性,推荐使用指针或智能指针存储对象。
切片问题示例
#include <iostream>#include <vector>
class Base {public: virtual void show() const { std::cout << "Base show" << std::endl; } virtual ~Base() {}};
class Derived : public Base {public: void show() const override { std::cout << "Derived show" << std::endl; }};
int main() { std::vector<Base> vec; Derived d; vec.push_back(d); // 切片发生,派生类特有部分被丢弃
vec[0].show(); // 输出: Base show
return 0;}
使用指针避免切片
#include <iostream>#include <vector>#include <memory>
class Base {public: virtual void show() const { std::cout << "Base show" << std::endl; } virtual ~Base() {}};
class Derived : public Base {public: void show() const override { std::cout << "Derived show" << std::endl; }};
int main() { std::vector<std::unique_ptr<Base>> vec; vec.emplace_back(std::make_unique<Derived>());
vec[0]->show(); // 输出: Derived show
return 0;}
注:当使用容器存储对象时,应当使用指针或者智能指针,不要使用类类型。
智能指针选择
std::unique_ptr
:- 独占所有权,不可复制,只能移动。
- 适用于明确的单一所有权场景。
std::shared_ptr
:- 共享所有权,可以被多个指针共享和引用计数。
- 适用于需要多个所有者的场景。