2016-03-01 11 views
-1

Я получаю ошибку компиляции «не может преобразовать« Чипы »в« GroceryItem », и мне трудно понять, как фактически преобразовать что-то в объект виртуального класса. Учитель предоставил класс GroceryCart, который добавляет GroceryItems к телеге в «основной» и печатает телегу из.Виртуальный класс и наследование

class GroceryItem { 
public: 
    virtual ~GroceryItem(); 
    virtual float GetPrice() = 0; 
    virtual char* GetDescription() = 0; 
    virtual float GetWeight() = 0; 
}; 



#include "GroceryItem.h" 

class Chips : public GroceryItem { 
public: 
    Chips(); 
    ~Chips(); 
    float GetPrice(); 
    char* GetDescription(); 
    float GetWeight(); 
private: 
    float price; 
    char* itemName; 
    float weight; 
}; 

#include "GroceryItem.h" 
#include "Chips.h" 

Chips::Chips() { 
    price = 0.75; 
    itemName = new char[5]; 
    itemName = "Chips"; 
    weight = 1.0; 
} 

Chips::~Chips() { 
    delete this; 
} 

float Chips::GetPrice() { 
    return price; 
} 

char* Chips::GetDescription() { 
    return itemName; 
} 

float Chips::GetWeight() { 
    return weight; 
} 



int main(int argc, const char * argv[]) 
{ 
    GroceryCart c; 
    c.AddItemToCart(new Chips); 
    std::cout << c; 
    return 0; 
} 
void GroceryCart::AddItemToCart(GroceryItem *i) 
{ 
    items.push_back(i); 
} 
+0

Можете ли вы показать метод GuggeryCart 'AddItemToCart'? – MtRoad

+0

в самом низу – Bobby

+2

Вы должны пометить язык в вопросе. – mattsap

ответ

0

обеспечивает полный журнал ошибок, убедитесь, что контейнер параметрироваться с указателем на GroceryItem (< GroceryItem *>)

Как кто-то указало

delete[] itemName; //destructor 

, но вы также должны определить нетривиальный copy-constructor/operator =, поэтому лучше заменить char * на std :: string, также необходимо определить деструктор для базового абстрактного класса, даже это чистый виртуальный.