Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Cắt đối tượng (Object Slicing) trong C++

Cắt đối tượng (Object Slicing) xảy ra khi gán một đối tượng của lớp dẫn xuất (derived class) vào một biến của lớp cơ sở (base class). Quá trình này làm mất đi các phương thức và biến thành viên đặc trưng của lớp dẫn xuất, chỉ giữ lại phần "cơ sở" của đối tượng.

Ví dụ minh họa

class Foo {
    int a;
};

class Bar : public Foo {
    int b;
};

Lớp Bar kế thừa từ Foo, do đó có 2 biến thành viên: a (từ Foo) và b (riêng của Bar).

Bar bar;
Foo foo = bar;  // Object slicing xảy ra tại đây

Khi gán bar cho foo, biến b bị "cắt bỏ" — thông tin về b không còn tồn tại trong đối tượng foo. Đây được gọi là cắt biến thành viên (member slicing).

Hậu quả

  • Mất dữ liệu và hành vi đặc thù của lớp dẫn xuất
  • Gây lỗi logic khó phát hiện khi sử dụng đa hình (polymorphism)
  • Phương thức ảo (virtual functions) không hoạt động như mong đợi

Cách tránh

  • Sử dụng con trỏ hoặc tham chiếu (reference) đến lớp cơ sở: Foo* foo = &bar; hoặc Foo& foo = bar;
  • Sử dụng smart pointers (std::unique_ptr, std::shared_ptr)
  • Thiết kế cẩn thận khi cần copy đối tượng đa hình