【问题标题】:inserting subclasses into a superclasses array in c++将子类插入到 C++ 中的超类数组中
【发布时间】:2011-02-07 17:00:10
【问题描述】:

这是我只知道我做错了的事情之一。我的任务很简单。

用c++创建3个类,

产品、软件、书籍。产品是超级的,书和软件是产品。 然后制作一个指针数组,并用软件和书籍填充数组。

所以我做了以下

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();
};

【问题讨论】:

  • 这是 C 还是 C++?我想这显然是 C++。使用 std::vector 而不是数组
  • 你能告诉我们ProductBookSoftware类的定义吗?如果BookSoftware 都是Product 的子类型,您应该能够将所有三种类型的指针放入Product * 数组中。
  • @Falmarri 标题中写着 c++。
  • @OVERTONE:是的,但是您使用的是数组而不是 std::vector,这就是我问的原因。
  • 因为那是任务。我几乎没有接触过矢量,这只是对继承的介绍。如果它有助于将 c++ 添加到问题中。

标签: c++ arrays inheritance pointers subclass


【解决方案1】:

你应该使用公共继承:

class Book : public Product {
...
};

[编辑]

如果您想在子类中以不同方式实现 getPrice(),您还应该将其声明为虚拟。当您调用 getPrice() 以获得指向 Product 的指针时,这将使编译器调用右子类的 getPrice()

virtual double getPrice();

【讨论】:

    【解决方案2】:

    由于数组的类型为Product,您应该将pSoftware 声明为指向Product 的指针:

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

    【讨论】:

    • 如果软件从产品公开继承,这应该在功能上与 OP 的原始代码相同。
    • 不允许转换为无法访问的基类产品。以前从未见过这个。去网上看看。
    • @Alan:不完全是。这实际上是为超出范围时不会被销毁的产品对象分配空间。 OP 通过分配对局部变量的引用来自找麻烦。
    【解决方案3】:

    已经有一段时间了,但是 C++ 中默认的继承类型是什么?应该

    class Book:Product
    {
    

    成为

    class Book: public Product
    {
    

    无论如何,明确表达总是一个好主意。

    【讨论】:

    • 我在这里学习 :D 谢谢。我习惯在 java 中使用扩展,不知道它们必须是公开的。谢谢你
    【解决方案4】:

    您不能将软件* 转换为产品* 以将其放入您的阵列中吗? productList[0] = (Product*)pSoftware;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多