Vector 可以将派生类对象作为基类变量吗?
在 C 中,当尝试存储派生类的对象时会出现一个令人困惑的问题在其元素属于基类类型的向量中。就像提供的示例中一样:
#include <iostream> #include <vector> using namespace std; class Base { public: virtual void identify() { cout << "BASE" << endl; } }; class Derived : public Base { public: virtual void identify() { cout << "DERIVED" << endl; } }; int main() { Derived derived; vector<Base> vect; vect.push_back(derived); vect[0].identify(); return 0; }
由于虚拟方法分派,此代码不会按预期打印“DERIVED”,而是打印“BASE”。这种异常行为源于对象切片。
罪魁祸首:对象切片
对象切片是指在以下情况下丢失派生类特定数据:将派生类的实例存储在基类类型的变量中。这是因为编译器仅复制对象的共享部分,丢弃派生类特定的成员。
使用智能指针的替代方法
克服对象切片并实现多态行为,最佳实践是在向量中存储指向基类对象的指针。这消除了切片,同时保留了派生类方法的动态性质。
vector<Base*> vect; vect.push_back(&derived); // Store a pointer to the Derived object
C 方式:使用智能指针
为了增强面向对象的方法,建议使用智能指针而不是原始指针。智能指针自动处理内存管理,确保代码安全、干净。
#include <memory> vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>());
以上是向量可以在没有对象切片的情况下保存派生类对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!