c中的多态性,父类向量中的类型丢失
发布时间:2020-12-16 09:39:37 所属栏目:百科 来源:网络整理
导读:我有一个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) {
|
我有一个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));
}
}
是否有可能使项目打印出与硬编码调用相同的结果? 解决方法
你看到的是
Object Slicing.
您将Derived类的对象存储在一个向量中,该向量应该存储Base类的对象,这会导致对象切片,并且被存储的对象的派生类特定成员被切掉,因此存储在向量中的对象就像基类的对象. 解: 您应该在向量中存储指向Base类对象的指针: vector<X*> 通过存储指向Base类的指针,就没有切片,你可以通过使函数虚拟来实现所需的多态行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
