2016-01-19 2 views
-2

Я нахожусь в проекте C++, которому нужен вектор классов Derived, чтобы перебрать его и вызвать метод из базового класса. Для этого я сделал:Программа сбоев с вектором производных классов в C++

--edit:

class BaseClass { 
    private: 
     float attribute1; 
     float attribute2; 

    public: 
     constructor; 
     virtual destructor; 
     virtual float virtualMethod() { return (getter1() + getter2()*getter1());} 

    protected: 
     virtual float getter1(); 
     virtual float getter2(); 
} 

Производные классы только имеют свои собственные атрибуты и методы получения:

DerivedClassA : public BaseClass { 
    private: 
     std::string att1A; 
     std::string att2A; 
     int att3A; 
    public: 
     constructor; 
     virtual destructor; 
    protected: 
     //getters for att1,att2 and att3; 
} 

DerivedClassB : public BaseClass { 
    private: 
     std::string att1B; 
     std::float att2B; 
     int att3B; 
    public: 
     constructor; 
     virtual destructor; 
    protected: 
     //getters for att1,att2 and att3; 
} 

vector<BaseClass*> vector; 
BaseClass *object1 = new DerivedClassA(string, string, int, float, float); 
BaseClass *object2 = new DerivedClassB(string, float, float, float); 
vector.push_back(object1); 
vector.push_back(object2); 

for (int i=0; i<vector.size(); i++) { cout << vector[i]->virtualMethod() << endl; } //virtualMethod returns a float. 

Желаемое поведение: когда я создаю объект из Производные классы я даю им некоторые значения. Интересными являются 2 последних поплавка в этом случае. Виртуальный метод вызывает их значения и завершает операцию: firstfloat + secondfloat*firstfloat и показывает возвращаемое значение.

Когда я пытаюсь запустить его, программа выходит из строя в вызове virtualMethod. Я делаю что-то неправильно? Я искал некоторые ответы в других примерах, но они более или менее похожи на это, и я даже пытаюсь использовать итератор и ничего. Благодаря!

+6

Я думаю, что ключ к решению здесь ... исправьте меня, если я ошибаюсь ... в коде, который вы не показываете (virtualMethod()). – Robinson

+0

Измените свой вопрос с помощью определений 'virtualMethod' в' BaseClass', 'DerivedClassA' и' DerivedClassB'. – TartanLlama

+0

Код virtualMethod только: return (getatribute1() + getatribute2() * getatribute3()), но это не имеет значения. Я заменил «return (0.2)» и ничего –

ответ

0

код не является полным и далеко от него составлен так, как вы его описываете, возможно, вам лучше разместить полный код, а не только фрагменты, которые не отображают проблему.

Что я вижу, так это то, что вы переписываете только части виртуальных функций (что приводит к производным классам с использованием реализации базовых классов). VirtualMethod(), например. возвращает float, и нет никакого virtualMethod() для std :: string. Имейте в виду, что «int foo()» и «std :: string foo()» являются 2 полными различными функциями и что «std :: string getter1()« не »отменяет float getter1()«

Возможно, ваш виртуальный метод лучше реализован с использованием шаблона?

Смежные вопросы