向量容器中的对象切片和多态性
在 C 中处理继承时,有时需要在容器中存储派生类的实例比如向量。然而,使用向量存储基类对象的直接方法可能会导致对象切片,从而丢失派生类特定的数据。
考虑以下程序:
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; }
代码创建 Base 对象的向量并存储 Derived 类的实例。但是,当对存储的对象调用identify() 方法时,它会打印“BASE”而不是“DERIVED”。这是因为将 Derived 对象分配给 Base 向量元素时会发生对象切片,导致派生特定数据丢失。
为了防止对象切片并保留多态行为,首选解决方案是使用指针向量中的基类对象:
vector<Base*>
这确保派生类特定数据保持完整。此外,为了避免手动内存管理,可以使用智能指针:
vector<std::shared_ptr<Base>>
智能指针通过 RAII(资源获取即初始化)确保自动内存管理,使其成为更强大且符合 C 的方法。
以上是使用 C 向量继承时如何避免对象切片?的详细内容。更多信息请关注PHP中文网其他相关文章!