0

我有一些问题需要找到相关的解决方案来解决我的问题。我必须从一个类中返回一些数据,而数据的类型取决于类。我的第一个解决方案是:

class Base
{
    virtual QVector<Data*> getData() const = 0;
};

class Derived : public Base
{
   virtual QVector<DerviedData*> getData() const = 0;
};

但我知道这是不可能的,即使 DerivedData 扩展了 Data,因为无效的协变返回类型。

所以我想出了另一个暗示模板的想法。我所做的是将 Base 类转换为模板类:

template<class T>
class Base
{
    virtual QVector<T*> getData() const = 0;
}

然后我可以写一个Derived这样的构造函数:

Derived::Derived() : Base<DerivedData>() {}

但知道我还有另一个问题。假设我编写了另一个类,该类有一个方法,该方法采用任何 Base 类的参数。

void Foo::doSomething(Base* b) { 
    b->getData(); 
}

这不会编译并说

在没有参数列表的情况下无效使用模板名称“Base”

我完全理解。

假设我的代码看起来像这样:

DerivedClass1 d1;
DerivedClass2 d2;
DerivedClass3 d3;

this->doSomething(&d1);
this->doSomething(&d2);
this->doSomething(&d3);

我的解决方案是什么?我可以做类似“模板化”方法 doSomething 的事情吗?

this->doSomething<DerivedData>(&d1);

使用类似的原型

template<class T>
void doSomething(Base<T>* b);

那可能吗 ?这是一种好的思维方式吗?来自Java,我曾经通过使用通配符来解决这些问题

abstract List<? extends Data> getData();

但是我听说在 C++ 中严格来说没有这样的东西(或多或少可以用 类似的东西来模拟 std::is_base_of)。

感谢您的时间。

4

1 回答 1

1

你可以让Derived::getData()返回QVector<Data*>。当你需要使用它时,找出里面的指针QVector是指向Dataor DerivedData、 usingdynamic_cast还是类似的方法。

于 2017-03-29T16:40:27.473 回答