我有一个类A,这是父类B和C. 和A类X,这是一个家长Y和Z.多态性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类型的?
'y.foo(C); //打印A'。当然,这不是理想的行为?我想你想让它打印“B”?我认为你需要澄清你想要的行为。给定'p.foo(q)',是否要打印的文本取决于q的类型,或p的类型还是两者?考虑所有9个选项'{x,y,z} .foo({a,b,c});'并告诉我们你期望的行为是什么。 – 2012-01-09 15:02:59
期望的行为是第一次打印 含义y.foo(b)应该打印B,并且y.foo(c)应该调用基类x.foo()并打印A – Bg1987 2012-01-09 16:19:55
OK。所以在'p.foo(q)'中:如果q的(动态)类型与'p :: foo'的参数类型相同,那么应该打印该类型。在所有其他情况下,它应该打印“A”。 – 2012-01-09 16:32:54