341 字
2 分钟
10容器继承与切片问题
2025-02-12

容器继承与切片问题#

C++ 容器(如 std::vectorstd::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
    • 共享所有权,可以被多个指针共享和引用计数。
    • 适用于需要多个所有者的场景。
10容器继承与切片问题
https://chrisnake11.github.io/blog/posts/coding/c基础/10容器继承与切片问题/
作者
Zheyv
发布于
2025-02-12
许可协议
CC BY-NC-SA 4.0