创建抽象类的动态数组

Posted

技术标签:

【中文标题】创建抽象类的动态数组【英文标题】:Creating a dynamic array of an abstract class 【发布时间】:2017-01-02 20:41:38 【问题描述】:

我正在尝试创建一个抽象类 (CellPhone) 的动态数组,然后用 Cell1 和 Cell2 类型的不同对象填充它。

我尝试使用动态数组和向量,但都报错:

所有类都已创建并可以工作,但主要是:

Cell1 c1("Orange", "Hello! This is your friend Rima, call me when you can.", 0777170, "Sony");
Cell2 c2("Zain", "Call me ASAP, Sam", 0777777777, "blue", "wifi");
Cell1 c3("Omnia", "Let me know when you can pass by", 0711111111, "Samsung");

CellPhone *c[3];

*c[0]=&c1;       //Conversion to base class error


vector<CellPhone*>  cp;
cp.push_back(&c1);      //Conversion to base class error

我查看了其他案例,但两种方式都出现错误?为什么?以及如何解决?

编辑:这里是类头供参考:

 class CellPhone
  private:
     string branch, message;
     int phoneNumber;
 public:
    CellPhone(string, string, int);
    virtual void receiveCall() = 0;
    void receiveMessage();
    virtual void dial() = 0;
    void setBranch(string);
    void setMessage(string);
    void setPhoneNumber(int);
    string getBranch();
    string getMessage();
    int getPhoneNumber();

;

  #include "CellPhone.h"

 class Cell1:CellPhone
 private:
     string cameraType;
     bool isCameraUsed;
 public:
     Cell1(string, string, int, string);
     void capture();
     void receiveCall();
     void dial();
     void setCameraType(string);
     string getCameraType();

;

 #include "Cell1.h"

 class Cell2:CellPhone
 private:
      string wifi, bluetooth;
public:
     Cell2(string, string, int, string, string);
void turnBluetoothOn();
void turnBlueToothOff();
void setWifi(string);
void setBluetooth(string);
string getWifi();
string getBluetooth();
void receiveCall();
void dial();

;

Cell2 具有 Cell1 的引用,因为如果没有,则在 main 中会出现类重定义错误。

【问题讨论】:

没有CellPhone、Cell1、Cell2的定义,是无法回答的。 ***.com/help/mcve 如果不选择继承,C++默认为私有继承。这不谨慎。 另外,您的 CellPhone 类缺少虚拟析构函数。 【参考方案1】:

只需将Cell2 : CellPhone 类替换为class Cell2 : public CellPhone

否则,无法访问从Cell2CellPhone 的转换(如果未指定,则继承为private

编辑:如下所述,强烈建议您为 CellPhone 类声明一个虚拟析构函数(建议您在某个时候专攻的任何类)。

【讨论】:

此外,您应该向 CellPhone 添加虚拟析构函数的可能性为 99%。 @Frank:如果您将派生对象存储在数组中以指向基类指针,则它是 100% 的可能性。 OP 是哪个。 只有当他从该向量中删除对象时才会如此,但情况并非如此,因为他在堆栈上创建了 Cell 对象。有一些罕见的边缘情况不需要/不需要虚拟析构函数(并且通常涉及受保护的析构函数以避免问题),但几乎可以肯定这里不是这种情况。 @IInspectable:只有在最后使用容器销毁对象的情况下。正如 OP 所发布的,对象是作为局部变量在堆栈上创建的,它们会被很好地销毁。 @PaulMcKenzie 再次:罕见的边缘情况。语言在看到虚函数时不添加虚析构函数是有原因的。

以上是关于创建抽象类的动态数组的主要内容,如果未能解决你的问题,请参考以下文章

数组类的创建(下)

如何复制动态分配的对象(具有一个类的 const 成员)

数据结构中的数据——动态数组的创建

考虑到行跨度和列跨度,如何从一维数组创建动态 html 表?

Java动态代理与静态代理的定义与区别??

如何正确分配动态一维数组作为类的成员?