0

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

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

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

  • 如果是这样,在我的 SubClass1 中的重载 >> 中,将类型动态转换为 BaseClass 是否可以调用 BaseClass 中的友元重载 >>?

http://ideone.com/QM5sRY

编辑:

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

我有一个程序需要输入,并将其分布在各个类和子类中。它应该将输入作为Cin >> class;,在这种情况下,我已经重载了 >> 运算符。

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

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

理想情况下,输出应该是

Printing:Data
X = 1
Y = 2
4

1 回答 1

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
于 2013-05-02T15:33:20.903 回答