2つのクラスがあります。基本クラスは「Port」で、派生クラスは「VintagePort」です。私の知る限り、派生クラスのオブジェクトへの基本クラスの参照またはポインターを使用すると、参照またはポインターではなく、オブジェクトへの正しいメソッドが自動的に検出されます(メソッドが仮想の場合)。
私の状況では、両方のクラスにフレンド関数「operator<<」があることがわかります。しかし、基本クラスにポインターを使用している場合は、基本クラスからのみ関数を呼び出すように見えます。「cout<<VintagePort」を使用すれば問題なく動作します。私の質問:それは正しく機能していますか、それともコードで何かを修正する必要がありますか?
std::ostream& operator<<(std::ostream& os, const Port& p)
{
os << p.brand << ", " << p.style << ", " << p.bottles << endl;
return os;
}
std::ostream& operator<<(std::ostream& os, const VintagePort& vp)
{
os << (const Port &) vp;
cout << ", " << vp.nickname << ", " << vp.year << endl;
return os;
}
VintagePort vp1;
VintagePort vp2("Gallo", "lekko brazowy", 50, "Blaze", 1990);
VintagePort vp3(vp2);
Port* arr[3];
arr[0] = &vp1;
arr[1] = &vp2;
arr[2] = &vp3;
for (int i = 0; i < 3; i++)
{
cout << ">>>>> " << i+1 << " <<<<<" << endl;
cout << *arr[i]; // call for base class instead derived class
arr[i]->Show();
}