簡體   English   中英

指向包含派生類對象和重載<<運算符的基類的指針數組

[英]Array of pointers to the base class that contains objects of derived classes and overloaded << operator

我有以下問題。

我已經創建了一個指向基類對象的指針數組,但是我在這個數組中也存儲了派生類中對象的指針。

我還重載了每個類中的<<operator來顯示對象。 但是,當我將這個重載的<<operator應用於上面提到的數組時,它會將所有指針視為指向基類的對象。

下面我將介紹描述問題的代碼。 我需要這個重載的運算符才能正常工作,因為我需要將數組指向的對象保存在文件中。

    #include <iostream> 
    #include <cstdio>
    #include <cstdlib>

    using namespace std;

    class Base
    {
       public:
       int basevar;
       Base(): basevar(1) {};
       virtual void dosth(){};
       friend ostream & operator<<(ostream & screen, const Base & obj);
    };

    ostream & operator<<(ostream & screen, const Base & obj)
    {
       screen << obj.basevar;
       return screen;
    };

    class Der1: public Base
    { 
        public:
        int de1;
        Der1(): de1(2) {};
        virtual void dosth()
        {
           cout << "Der1" << endl;
        }
        friend ostream & operator<<(ostream & screen, const Der1 & obj);
    };

    ostream & operator<<(ostream & screen, const Der1 & obj)
    {
       Base b;
       b = static_cast <Base>(obj); 
       screen << b; 
       screen << " " << obj.de1;
       return screen;
    };

    class Der2: public Base
    { 
        public:
        int de2;
        Der2(): de2(3) {};
        virtual void dosth()
        {
           cout << "Der2" << endl;
        }
        friend ostream & operator<<(ostream & screen, const Der2 & obj);
    };

    ostream & operator<<(ostream & screen, const Der2 & obj)
    {
        Base b;
        b = static_cast <Base>(obj); 
        screen << b; 
        screen << " " << obj.de2; 
        return screen; 
    }

    int main()
    {
         Base * array[] = {new Base(), new Der1(), new Der2()};
         for(int i=0; i<3; ++i)
         {
             cout << *array[i]; // <- always displays objects as if they were from the base class
         }
         return 0;
    }

您可以通過以下方式在基類中聲明虛函數

class Base
{
   public:
   int basevar;
   Base(): basevar(1) {};
   virtual std::ostream & out( std::ostream &os ) const
   {
       return os << basevar;
   }

   virtual void dosth(){};
   friend ostream & operator<<(ostream & screen, const Base & obj);
};

在這種情況下,操作員將看起來像

ostream & operator<<(ostream & screen, const Base & obj)
{
    return obj.out( screen );
};

並在派生類中重新定義虛函數。 例如

class Der1: public Base
{ 
    public:
    int de1;
    Der1(): de1(2) {};
    std::ostream & out( std::ostream &os ) const
    {
       return Base::out( os ) << " " << obj.de1;
    }
    virtual void dosth()
    {
       cout << "Der1" << endl;
    }
};

在這種情況下,不需要為派生類定義運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM