c++ - 来自具有相同基类的多个类的元素 vector

标签 c++ qt vector casting derived-class

我目前正在开发一个项目,我需要一个来自多个类的对象 vector ,它们共享相同的基本类,以便稍后我可以从中调用方法。假设我的类(class)如下所示:

class basicClass
{
public:
  void seta(bool a);
  basicClass();
private:
  int a;
};

class derivedClass1 : public basicClass
{
int b;
public:
  derivedClass1();
  void methodInClass1();
};

class derivedClass2 : public basicClass
{
int c;
public:
  derivedClass2();
  void methodInClass2();
};

然后在 main.cpp 中我想调用以下方法。

QVector<basicClass*> vectorINeed;
derviedClass1 *object= new derviedClass1();

qDebug() << object->basicClass::seta(true);
qDebug() << object->derivedClass1::methodInClass1();

vectorINeed.append(object);

qDebug() << vectorINeed[0]->basicClass::seta(true);
qDebug() << vectorINeed[0]->derivedClass1::methodInClass1();

甚至认为我看到前三个工作得很好,最后一个没有,我得到的错误是“derivedClass1'不是'basicClass'的基础”。有什么方法可以修复我的类(class),以便我可以真正做我想做的事情吗?我尝试将 basicClass 中的方法更改为 virtual 但这并没有解决问题,我也尝试了一些转换,但要么我做错了什么,要么这不是解决我的问题的方法。

我真的很感激任何帮助,甚至是可能有用的提示。也希望编辑没问题。

最佳答案

当您提供 DerivedClass 的拷贝时到包含 BaseClass 指针的 vector 中,您实际上是将 vector 内部的指针向下转换为 BaseClass对象,这意味着你失去了所有的 DerivedClass类型信息(方法、成员等)。而 DerivedClass内容仍将存在,它们将不再可访问。

举个例子:

class MyBaseClass
{
public:
  MyBaseClass();
  virtual ~MyBaseClass();

  void SetValue(const int value);
  int GetValue() const;

private:
  int m_value;
};


class MyDerivedClass : public MyBaseClass
{
public:
  MyDerivedClass();
  virtual ~MyDerivedClass();

  void SetExtraValue(const std::string &value);
  std::string GetExtraValue() const;

private:
  std::string m_extraValue;
};

“MyBaseClass”创建的每个变量只保证 SetValueGetValue方法可用。 MyDerivedClass 创建的每个变量都保证有 4 个方法可用,两个来自基类的方法,以及 SetExtraValueGetExtraValue方法。

如果您创建 MyBaseClass 的 vector 指针,你只保证方法 SetValueGetValue将在该 vector 的内容上可用,即使内容都是 MyDerivedClass .

考虑您示例的这个修改版本:

QVector<basicClass*> vectorINeed;
basicClass *object= new basicClass();  // <--- Create basicClass instance instead of derivedClass1 instance.

qDebug() << object->basicClass::seta(true);

vectorINeed.append(object);

qDebug() << vectorINeed[0]->basicClass::seta(true);
qDebug() << vectorINeed[0]->derivedClass1::methodInClass1(); // <--- What would happen here?

编译器不能保证 vector 中的对象是一个derivedClass1。对象,只有一个 basicClass对象,因此它不能保证 methodInClass1方法将可用。

在我看来,您有三个选择:

  1. 将 vector 声明更改为 QVector<derivedClass1 *> vectorINeed如果可以的话。或者……
  2. 针对 object 运行您的方法而不是 vectorINeed[0] .
  3. 如果你能保证 vector 的内容永远是derivedClass1类型, 您可以使用 dynamic_cast在执行 methodInClass1 之前执行转换为 derivedType 的函数.

关于c++ - 来自具有相同基类的多个类的元素 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301663/

相关文章:

c++ - Valgrind - 未初始化的值和字节?

c++ - 是否存在 "holds"当前元素索引/指针的 STL 数据结构?

c++ - 将速度场可视化为定向箭头

c++ - 在 C++ 中使用来自另一个函数的变量

c++ - 重载新建和删除与自定义分配器

c++ - 尝试启动新线程时设置不正确

c++ - 如何在 C++ 中将 Big/Little-Endian 字节转换为整数,反之亦然

c++ - QT关闭子窗口后如何执行函数

c++ - 修改 vector 引用。什么无效?

c++ - 不能将 vector 作为参数传递 c++