вставка подклассов в массив суперклассов в C ++ - PullRequest
3 голосов
/ 07 февраля 2011

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

Создать 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();
};

Ответы [ 4 ]

3 голосов
/ 07 февраля 2011

Вы должны использовать публичное наследование:

class Book : public Product {
...
};

[править]

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

virtual double getPrice();
0 голосов
/ 07 февраля 2011

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

0 голосов
/ 07 февраля 2011

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

class Book:Product
{

быть

class Book: public Product
{

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

0 голосов
/ 07 февраля 2011

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

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