2011-02-07 1 views
2

Это одна из тех вещей, где я просто знаю, что я делаю это неправильно. Моя задача проста.Вставка подклассов в массив суперклассов в C++

Создание 3-х классов в C++,

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

так я сделал следующее

int main() 
{ 
Product *productList[10];   


Book *pBook;      
Book q(5); 
pBook = &q; 
pBook->getPrice(); 

Software *pSoftware; 
Software g(5); 
pSoftware = &g; 
pSoftware ->getPrice(); 


productList[0] = pSoftware; // fill it with software, cannot do this. 

Есть ли способ вставки подкласса в супер массив классов. Или я должен определить массив указателей как что-то еще.

определения классов ниже

class Product 
{ 
public: 

double price; 

double getPrice(); 

Product::Product(double price){}; 
}; 


class Book: public Product 
{ 
public: 
Book::Book(double price) 
    :Product(price) 
{ 
} 
double getPrice(); 
}; 

class Software: public Product 
{ 
public: 
Software::Software(double price) 
    :Product(price)     // equivalent of super in java? 
{ 
}         // code of constructor goes here. 
double getPrice(); 
}; 
+1

Это C или C++? Думаю, это, очевидно, C++. Используйте 'std :: vector' вместо массива – Falmarri

+1

Можете ли вы показать нам определения классов' Product', 'Book' и' Software'? Вы должны иметь возможность помещать все три типа указателей в массив 'Product *', если 'Book' и' Software' - все подтипы 'Product'. – birryree

+0

@Falmarri, он говорит C++ в названии. – OVERTONE

ответ

0

Поскольку массив типа Product, вы должны объявить pSoftware как указатель на Product:

Product *pSoftware = new Software(5); 
// ... 
productList[0] = pSoftware; 
+0

Это должно быть функционально идентично исходному коду OP, если Программное обеспечение наследуется публично от Product. – Alan

+0

преобразование в продукт неподходящего базового класса не допускается. никогда не видел этого раньше. посмотрим онлайн. – OVERTONE

+0

@Alan: Не совсем. Это фактически выделяет пространство для объектов продукта, которые не будут уничтожены, когда они выйдут из области видимости. OP запрашивает проблемы, назначая ссылки на локальные переменные. – Falmarri

3

Вы должны использовать открытое наследование:

class Book : public Product { 
... 
}; 

[изменить]

Вы также должны объявить getPrice() виртуальным, если вы хотите реализовать его по-разному в дочерних классах. Это заставит компилятор вызов getPrice() класса ребенка прямо при вызове getPrice() для указателя на Product:

virtual double getPrice(); 
0

Это было некоторое время, но то, что тип наследования по умолчанию в C++? Если

class Book:Product 
{ 

быть

class Book: public Product 
{ 

Это всегда хорошая идея, чтобы быть явным в любом случае.

+0

им здесь, чтобы узнать: D спасибо за это. я использовал для использования расширений в java, не знал, что они должны быть публичными. Спасибо за это – OVERTONE

0

Не можете ли вы просто приложить программное обеспечение * к продукту *, чтобы поместить его в свой массив? productList [0] = (продукт *) pSoftware;