0

我目前正在研究一个项目,其中我需要来自多个类的对象向量,它们共享相同的基本类,以便稍后我可以从中调用方法。假设我的课程如下所示:

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'的基础”。有什么办法可以修复我的课程,以便我可以真正做我想做的事情?我尝试将 basicClass 中的方法更改为 virtual 但这并不能解决问题,我还尝试了一些强制转换,但要么我做错了,要么这不是解决我的问题的方法。

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

4

2 回答 2

1

当您将 of 复制DerivedClass到包含 指针的向量中时BaseClass,您实际上是将向量内的指针向下转换为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 个方法可用,基类中的两个方法和SetExtraValueandGetExtraValue方法。

如果你创建一个MyBaseClass指针向量,你只保证方法SetValueGetValue将在该向量的内容上可用,即使 CONTENTS ARE ALL 也是如此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?

编译器不能保证向量内的对象是一个derivedClass1对象,只是一个basicClass对象,因此它不能保证该methodInClass1方法是可用的。

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

  1. QVector<derivedClass1 *> vectorINeed如果可以,将向量声明更改为。或者...
  2. 运行你的方法object而不是vectorINeed[0].
  3. 如果您可以保证向量的内容始终是类型derivedClass1,则可以在执行之前使用该dynamic_cast函数执行对 derivedType 的强制转换methodInClass1
于 2013-08-18T17:51:28.247 回答
0

Although you are able to add derived classes to a vector of base classes, the vector is still of base classes.

Therefore, in effect, you are "casting" (I say casting but it's not quite) to a baseclass before adding to the vector.

To use a derived classes methods from a base class vector you'd want to make sure you are dealing with a derived class (maybe a get method with a static variable which is assigned at creation). Then cast the object in the vector back to the necessary derived class before using the function.

There may be a better way, but I need to brush up on my C++

于 2013-08-18T17:26:33.560 回答