我正在寻找一个对象向量,其中包含子类。
我以为我可以通过向基类声明一个指针向量(例如vector<BaseClass*> db
)来做到这一点,然后通过执行类似db.pushback(new subclass)
的操作将其声明为子类(我的例子)在下面的链接是一个不同的触摸,但沿着相同的线);
是否可以在这个意义上存储多个子类或者我是否需要为每个SubClass定义一个新的Vector?在给出的示例中,只有1,但实际上在我的程序中有四个。
如果是这样,在我的重载&gt;&gt;在SubClass1中,将动态类型转换为BaseClass工作以调用friended overloaded&gt;&gt;在BaseClass?
编辑:
对不起,我在问题的后半部分并不完全清楚。我应该扩大。
我有一个需要输入的程序,并将它分发到各自的类和子类中。它应该将输入作为Cin >> class;
,在这种情况下,我已经重载了&gt;&gt;运营商。
但是,当我将数据定义为子类(第34行到第39行和第44行)时,它似乎将其称为BaseClass,而不是Subclass。然后它在第10行调用Baseclass中定义的friend函数,而不是第21行。
我不完全确定我哪里出错了。
理想情况下,输出应为
Printing:Data
X = 1
Y = 2
答案 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