我有一個類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