のベクタータイプの損失私はクラスBおよびC そしてYに親クラスX、親であるクラスAを有し、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のベクトルにint型に入れます。永遠にA型になりますか?
'y.foo(C)、(
virtual destructor
は、とにかくここに良いアイデアをでしょう)。 //プリントA '。確かにこれは望ましい行動ではありませんか?私はあなたが "B"を印刷したいと思う?私はあなたが望む行動を明確にする必要があると思います。 'p.foo(q)'を指定すると、印刷されたテキストは、qのタイプ、pのタイプ、またはその両方に依存しますか? '{x、y、z} .foo({a、b、c});}という9つのオプションをすべて考えて、あなたの望む動作が何であるかを教えてください。 –希望の動作が最初のプリント 意味y.foo(b)はBを出力し、y.foo(c)は基本クラスx.foo()を呼び出してA – Bg1987
OKを出力する必要があります。したがって 'p.foo(q)'では:qの(動的)タイプが 'p :: foo'のパラメータのタイプと同じであれば、そのタイプを出力する必要があります。それ以外の場合は、 "A"が印刷されます。 –