C继承,覆盖时仍然会调用基函数
发布时间:2020-12-16 10:42:19 所属栏目:百科 来源:网络整理
导读:我有以下两个类,一个继承自另一个 Class A{ void print(){cout "A" endl;}}Class B : A{ void print(){cout "B" endl;}}Class C : A{ void print(){cout "C" endl;}} 然后在另一个课程中我有以下内容: vectorA things;if (..) things.push_back(C());else i
我有以下两个类,一个继承自另一个
Class A{ void print(){cout << "A" << endl;} } Class B : A{ void print(){cout << "B" << endl;} } Class C : A{ void print(){cout << "C" << endl;} } 然后在另一个课程中我有以下内容: vector<A> things; if (..) things.push_back(C()); else if (..) things.push_back(B()); things[0].print(); 这总是打印A. 解决方法
如前所述,您需要虚函数来启用多态行为,并且不能通过向量中的值直接存储类.
当您使用std :: vector< A>时,您将按值存储,从而存储您添加的对象,例如via push_back()被复制到A的实例,这意味着你将丢失对象的派生部分.这个问题被称为object slicing. 正如已经建议的那样,您可以通过将指针(或智能指针)存储到基类来避免这种情况,因此只有指针被复制到向量中: std::vector<A*> things; things.push_back(new B()); // ... use things: things[0]->print(); // clean up later if you don't use smart pointers: for(std::vector<A*>::iterator it = things.begin(); it != things.end(); ++it) delete *it; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |