8

私は次の設定をしています:

main.cpp:

int main()
{
    vector <Tour> tourList;
    Tour* tour_ptr;

    for (unsigned int i = 0; i < tourList.size(); i++)
    {
        tour_ptr = &tourList[i];
        tour_ptr->display();
    }
}

Tour.h:

class Tour
{
   public:
    virtual void display();
};

Tour.cpp:

void Tour::display()
{
    cout << "Tour ID: " << getID() << "\n";
    cout << "Description: " << getdescription() << "\n";
    cout << "Tour Fee: $" << getfee() << "\n";
    cout << "Total Bookings: " << getbookings() << "\n\n";
}

GuidedTour.h:

class GuidedTour : public Tour
{
    public:
            void display();
};

GuidedTour.cpp:

void GuidedTour::display()
{
    Tour::display();
    cout << "Max Tour Group Size: " << getMaxTourists() << "\n";
    cout << "Tour Guide: " << getGuideName() << "\n";
    cout << "Tour Date: " << getTourDate() << "\n\n";
}

GuidedTour は Tour クラスから継承され、基本の Tour クラスで display() 関数を virtual として指定しましたが、何らかの理由で、GuidedTour の display() 関数は呼び出されず、毎回基本関数だけが呼び出されます。私は何を間違っていますか?

4

3 に答える 3

11

std::vector最初は空であるため、コードは実際には何も出力しません。それ以外は、問題はオブジェクトのスライスによって引き起こされます(ベクトルに s を入れていると思います)push_back()GuidedTour

Tourオブジェクトのスライスが行われると、オブジェクトの一部のみが保存されます。GuidedTourこれが、 の出力が表示される理由ですTour::display()

問題を解決するには、(スマート) ポインターを使用し、オブジェクトを動的に割り当てることにより、オブジェクトをポリモーフィックに格納する必要があります。

int main()
{
    vector <std::unique_ptr<Tour>> tourList;

    for(...) {
       tourList.push_back(std::make_unique<GuidedTour>(/* constructor parameters */));
       ...
       tourList.push_back(std::make_unique<Tour>(/* constructor parameters */));
    }

    for (unsigned int i = 0; i < tourList.size(); i++)
    {
        tourList[i]->display();
    }
}

生のed ポインターではなくstd::unique_ptr/を使用していることに注意してください。それらを使用すると、オブジェクトを手動で管理およびing する問題が大幅に軽減されます。 [控えめな表現]は、バグや未定義の動作の原因となる場合があります。std::make_uniquenewdelete

boost::ptr_vector一部の人々は、または同様のものを使用することを提案する場合があることに注意してください。彼らの意見に耳を傾けてください。特に、彼らが代替案よりも優れている理由について議論している場合は注意してください。

于 2013-09-17T05:08:47.663 に答える
-1

「It's Pete」に同意します。GuidedTour クラスを使用していないためです。以下の方法を使えばうまくいきます。

int main()
{
  vector <GuidedTour> tourList;
  Tour* tour_ptr;

  for (unsigned int i = 0; i < tourList.size(); i++)
  {
      tour_ptr = &tourList[i];
      tour_ptr->display();
  }
}
于 2013-09-17T09:15:35.810 に答える