2013-05-02 1 views
0

Я ищу, чтобы провести вектор объектов, из которых будут подклассы.C++ Vector подклассов, используя его для перегрузки istream/ostream

Я думал, что я был бы в состоянии сделать это, объявив вектор указателей на BaseClass (Такие, как vector<BaseClass*> db), а затем объявить его как Подкласс делать что-то вроде db.pushback(new subclass) (Мой пример в ссылке ниже является сенсорным разные, но по тем же направлениям);

  • Возможно ли хранить несколько подклассов в этом смысле. Или мне нужно определить новый вектор для каждого субкласса? В приведенном примере есть только 1, но реалистично в моей программе четыре.

  • Если это так, то в моем перегруженном >> в SubClass1 будет динамическое кастинг типа для работы в BaseClass, чтобы вызвать перегруженный друг друга >> в BaseClass?

http://ideone.com/QM5sRY

Edit:

К сожалению, я не совсем ясно, в моей второй половине этого вопроса. Я должен был расшириться.

У меня есть программа, которая должна принимать входные данные и распространять их в соответствующих классах и подклассах. Он должен принимать вход как Cin >> class;, и в этом случае я перегрузил оператор >>.

Однако, когда я определяю данные в качестве подкласса (строки с 34 по 39 и строка 44), он, как представляется, называет его как BaseClass, а не подклассом. Затем он вызывает функцию друга, определенную в Baseclass по строке 10, а не в строке 21.

Я не совсем уверен, где я ошибаюсь.

В идеале результат должен быть

Printing:Data 
X = 1 
Y = 2 
+0

1) Можно, и это точка полиморфизма –

+0

Да, вы можете использовать 'зЬй :: VECTOR' в этом манера. Что касается остальной части вашего вопроса, не совсем понятно, что вы пытаетесь выполнить. – Chad

+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 
+0

Спасибо, помощник.Я пропустил интерпретацию использования виртуальной функции при ее чтении, считая, что абстрактное определение виртуальной функции копируется над базовым классом. Я не понимал, что они могут сосуществовать. Большое спасибо за помощь! –