我目前正在开发一个项目,我需要一个来自多个类的对象 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”创建的每个变量只保证 SetValue
和 GetValue
方法可用。 MyDerivedClass 创建的每个变量都保证有 4 个方法可用,两个来自基类的方法,以及 SetExtraValue
和 GetExtraValue
方法。
如果您创建 MyBaseClass
的 vector 指针,你只保证方法 SetValue
和 GetValue
将在该 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
方法将可用。
在我看来,您有三个选择:
- 将 vector 声明更改为
QVector<derivedClass1 *> vectorINeed
如果可以的话。或者…… - 针对
object
运行您的方法而不是vectorINeed[0]
. - 如果你能保证 vector 的内容永远是
derivedClass1
类型, 您可以使用dynamic_cast
在执行methodInClass1
之前执行转换为 derivedType 的函数.
关于c++ - 来自具有相同基类的多个类的元素 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301663/