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;
}
7.3 使用指针避免切片
#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;
}