C ++ Subclasses的向量,用它来重载istream / ostream

时间:2013-05-02 15:06:15

标签: c++ oop inheritance vector overloading

我正在寻找一个对象向量,其中包含子类。

我以为我可以通过向基类声明一个指针向量(例如vector<BaseClass*> db)来做到这一点,然后通过执行类似db.pushback(new subclass)的操作将其声明为子类(我的例子)在下面的链接是一个不同的触摸,但沿着相同的线);

  • 是否可以在这个意义上存储多个子类或者我是否需要为每个SubClass定义一个新的Vector?在给出的示例中,只有1,但实际上在我的程序中有四个。

  • 如果是这样,在我的重载&gt;&gt;在SubClass1中,将动态类型转换为BaseClass工作以调用friended overloaded&gt;&gt;在BaseClass?

http://ideone.com/QM5sRY

编辑:

对不起,我在问题的后半部分并不完全清楚。我应该扩大。

我有一个需要输入的程序,并将它分发到各自的类和子类中。它应该将输入作为Cin >> class;,在这种情况下,我已经重载了&gt;&gt;运营商。

但是,当我将数据定义为子类(第34行到第39行和第44行)时,它似乎将其称为BaseClass,而不是Subclass。然后它在第10行调用Baseclass中定义的friend函数,而不是第21行。

我不完全确定我哪里出错了。

理想情况下,输出应为

Printing:Data
X = 1
Y = 2

1 个答案:

答案 0 :(得分:0)

你应该有一个虚拟的fromSerial函数,它可以读入每个类的必要数据。这是一个示例http://ideone.com/WGwj8l。另请注意虚拟关键字的用户。你需要多态性。并注意虚拟析构函数。

#include <iostream>
#include <vector>
using namespace std;

class BaseClass{
public:
    int x;
public:
    BaseClass(){x = 0;}

    virtual istream& fromSerial(istream& stream){ return stream >> x; }
    virtual void print(){
     cout << "BaseClass::x = " <<  x << endl;
    }
    virtual ~BaseClass(){}
};

class SubClass1: public BaseClass{
public:
    int y;
public:
    SubClass1(){y = 0;}

   virtual istream& fromSerial(istream& stream){            
            BaseClass::fromSerial(stream); //read baseclass first
            return stream >> y;
    }
    virtual void print(){ 
     BaseClass::print();
     cout << "SubClass1::y = " << y << endl;
    }
};

BaseClass* createNewClass(BaseClass * temp)
{
    cout << "Input 2 values: ";
    temp->fromSerial(cin);
    return temp;
}

int main()
{
    vector<BaseClass*> db;
    db.push_back(createNewClass(new SubClass1));


    cout << "\nPrinting Data: " << endl;
    db[0]->print();
}

输入:     1 2

输出:

Input 2 values: 
Printing Data: 
BaseClass::x = 1
SubClass1::y = 2