c中的多态性,父类向量中的类型丢失

c中的多态性,父类向量中的类型丢失,第1张

概述我有一个A类,它是B和C类的父类. 还有一个X类,它是Y和Z的父类. 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 << " 我有一个A类,它是B和C类的父类.
还有一个X类,它是Y和Z的父类.

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型?

解决方法 你看到的是 Object Slicing.
您将Derived类的对象存储在一个向量中,该向量应该存储Base类的对象,这会导致对象切片,并且被存储的对象的派生类特定成员被切掉,因此存储在向量中的对象就像基类的对象.

解:

您应该在向量中存储指向Base类对象的指针:

vector<X*>

通过存储指向Base类的指针,就没有切片,你可以通过使函数虚拟来实现所需的多态行为.
正确的方法是使用合适的Smart pointer而不是在向量中存储原始指针.这将确保您不必手动管理内存,RAII将自动为您执行此 *** 作.

总结

以上是内存溢出为你收集整理的c中的多态性,父类向量中的类型丢失全部内容,希望文章能够帮你解决c中的多态性,父类向量中的类型丢失所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1214434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存