多态中的对象切片:在基类变量中存储派生类对象
在 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; }
在此在代码中,我们期望identify()方法打印“DERIVED”,因为它是一个虚拟方法。但是,它会打印“BASE”。这是因为派生对象在存储在 vect 向量中时会被切片,而该向量被声明为保存 Base 对象。
要解决此问题并保持多态行为,必须在向量中存储指向基类的指针而不是对象本身:
vector<Base*> vect; vect.push_back(&derived); vect[0]->identify();
现在,vect[0] 指向 Derived 对象,确保派生类的identify()方法被调用并打印“DERIVED”。
为了进一步增强这种方法并避免手动内存管理,可以使用智能指针。例如:
vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>()); vect[0]->identify();
这种方法可以确保自动管理 Derived 对象的内存,从而使代码更加高效且不易出错。
以上是对象切片如何影响 C 中的多态性?的详细内容。更多信息请关注PHP中文网其他相关文章!