1

これは宿題用です。

基本クラス Item と派生クラス Book があります。

私は op<< Item クラスでオーバーロードしています:

ostream& operator<<(ostream& out, const Item* const item)
{
    out << item->getName() << endl;
    return out;
}

Book クラスと同様に:

ostream& operator<<(ostream& out, const Book* const b)
{
    out << b->getPages() << endl;
    return out;
}

ただしItem、コードを実行するときに演算子のみが使用され、本のページは印刷されません。基本クラスだけでなく、「本」が印刷されるようにしました。私が読んだ資料から、基本クラスと派生クラスの両方の演算子をオーバーロードすることが想定されているように思われるため、本の情報が印刷されない理由がわかりません。

4

3 に答える 3

3

オーバーロードの代わりにポリモーフィズムを使用できます。クラスに仮想印刷メソッドを追加します。

class Item
{
 public:
  virtual void print(std::ostream& o) const
  {
    out << getName() << endl;
  }
 ....
};

class Book : public Item
{
 public:
  virtual void print(std::ostream& o) const
  {
    out << getPages() << endl;
  }
 ....
};

次に、単一のを使用しますostream& operator<<

ostream& operator<<(ostream& out, const Item& item)
{
    item.print(out);
    return out;
}

それから

Item* i1 = new Item(....);
Item* i2 = new Book(....);
std::cout << *i1 << " " << *i2 << std::endl;
delete i1;
delete i2;
于 2013-03-13T17:49:40.760 に答える
1

派生クラス関数のシグネチャを変更しても、基本クラスのメンバー関数のオーバーライドではなくなります。

于 2013-03-13T17:48:27.863 に答える
0

「ただし、コードを実行するときにItem 演算子のみが使用されます」 - この動作は、基本クラスの pointer*/reference& に適用することが原因である可能性があります。

同じ基本クラスから派生したさまざまなクラスのインスタンスを格納し、それらすべてに operator<< を適用するコンテナがある場合、その動作は呼び出されるインスタンスのクラスによって異なります。次のことを確認します。

1.基本クラスに少なくとも1つの仮想メソッドがあります(これにより、コンパイラー はそのクラスの仮想テーブルを生成し、後でこのテーブルはオペレーター dynamic_castで使用できます)
2.プロジェクトでRTTI(ランタイムタイプ識別)を有効にします: project/c++/language で RTTI サポートを有効にします。 3.次のアイデアを使用してoperator<< を実装します。

ostream& operator<<(ostream& out, const Item& item)
{
    if (Book* pBook = dynamic_cast<Book*>(&item)
    {
        out << pBook ->getName() << endl;
    }
    if (OtherDerivedClassName* pOtherDerivedClass = dynamic_cast<OtherDerivedClassName*>(&item)
    {
// do other interesting things
    }
    return out;
}
于 2013-03-13T18:23:01.623 に答える