大佬教程收集整理的这篇文章主要介绍了c中的多态性,父类向量中的类型丢失,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class A {}; class B : public A {}; class C : public A {}; class X { void foo(A) { std:: cout << "A"; } }; class Y : public X { void foo(B) {std::cout << "B"; } }; class Z : public X { void foo(C) {std<<cout <<"C"; } }; int main() { B b; C c; Y y; Z z; y.foo(b);//prints B // b is a B,and Y::foo takes a B,hence print B y.foo(c);//prints A // mismatch between types,fall BACk and print a z.foo(b);//prints A // mismatch between types,fall BACk and print a z.foo(c);//prints C // c is a C,and Y::foo takes a C,hence print C std::vector<A> v; v.push_BACk(b); v.push_BACk(c); //In this loop,it always prints A,but *this is what I want to change* for (size_t i = 0; i < v.size(); ++i) { z.foo(v.at(i)); y.foo(v.at(i)); } }
是否有可能使项目打印出与硬编码调用相同的结果?
这意味着我会将它们视为原始类型,而不是其父类型?
或者,一旦我把它们放在A的矢量中,它们将永远属于A型?
解:
您应该在向量中存储指向Base类对象的指针:
vector<X*>
通过存储指向Base类的指针,就没有切片,你可以通过使函数虚拟来实现所需的多态行为.
正确的方法是使用合适的Smart pointer而不是在向量中存储原始指针.这将确保您不必手动管理内存,RAII将自动为您执行此操作.
以上是大佬教程为你收集整理的c中的多态性,父类向量中的类型丢失全部内容,希望文章能够帮你解决c中的多态性,父类向量中的类型丢失所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。