我有以下问题。

我已经创建了一个指向基类对象的指针数组,但是我在这个数组中也存储了派生类中对象的指针。

我还重载了每个类中的<<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;
    }

===============>>#1 票数:3 已采纳

您可以通过以下方式在基类中声明虚函数

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;
    }
};

在这种情况下,不需要为派生类定义运算符。

  ask by Me_me_me translate from so

未解决问题?本站智能推荐:

5回复

重载<<运算符C ++ - 指向类的指针

工作正常,但我想使用指向类实例的指针。 即 这可能吗? 如果是这样,语法是什么? 谢谢 编辑:编译器错误是
3回复

C ++:运算符重载<用于指向对象的指针

我想通过它们的地址比较两个对象。 我尝试了运算符重载,它似乎不适用于指针,但适用于对象本身。 以下是相关代码:
2回复

指向派生类对象的C ++基类指针不调用派生相等运算符函数

我有一个电影基类和一些派生类(FunnyMovie,DramaMovie,ClassicMovie)。 我需要将它们存储在电影的二进制搜索树中。 每部电影都有不同的排序参数。 首先,我正在尝试对FunnyMovies进行排序。 当我比较两个FunnyMovie对象时,将调用FunnyMo
2回复

基类和派生类的虚拟插入运算符重载

有人可以解释一下如何确保从基本类型的指针到派生对象而不是基本函数的调用派生函数吗... 另外,virtual和override关键字是否是实现此目的的最佳实践? 我之前在每个类中都使用关键字friend定义了每个重载。 但是调用了基本函数来指向派生对象的基本指针。
1回复

istream >> ostream <<带*指针的运算符重载

如果>>和<<运算符正在处理指针,该如何重载? 在标题中: 在cpp中:
4回复

使用<<运算符和指向char的指针

<<的运算符重载将char*解释为C样式的字符串。 但是,如果char*指向单个字符,如何将其输出到流中?
3回复

用多态重载<<运算符

我已经在SO上阅读了一些类似的问题和答案,但是并没有真正理解那里的答案。 抱歉,如果这是重复的话。 有一个这样的基类。 现在,我继承自此: 我为CUInt32类重载了运算符<< 在int main()函数中,我执行以下操作: 我收到一条错误消息
5回复

运算符“<<”到指针

我有一个类Terminallog,它重载<<运算符。 如果我做以下事情 一切正常。 “stackoverflow.com很酷”以漂亮的彩色方式打印到屏幕上,这正是Terminallog应该做的事情。 现在我试试 这给了我一个编译器错误: 我可以看到将
5回复

指向基类数组的指针,并用派生类填充

如果我有一个基类,则仅包含虚方法,并且从基类派生了2个派生类,并实现了这些虚方法。 我如何: 要么: (或类似的东西) ...以便我可以通过DerivedClass访问BaseClass的方法,但是通过指针并且指针是DerivedClass的数组?
1回复

运算符<<重载,指针向量抛出错误

我有这个程序,它只是C ++的更新,我一直在通过重载的运算符<<获取要尝试打印的指针的地址。 这是所有源代码... 驱动程序 ToolB.h / ToolB.cpp Rock.h / Rock.cpp Paper和Scissors类与Rock类完全相同