我有两个界面:
elements
IContainer
的成员IElement
应该返回指向class CConcreteElement: public IElement
{
public:
virtual ~CConcreteElement() {}
void doSomething() { /* ... */ }
};
class CConcreteContainer: public IContainer
{
private:
std::vector<CConcreteElement *> m_vecElements;
public:
virtual ~CConcreteContainer() {}
virtual const std::vector<IElement *> &elements() const override
{ return m_vecElements; } // PROBLEM HERE
void doSomething()
{
for (CConcreteElement *pE : m_vecElements)
{
pE->doSomething();
}
}
};
的指针向量。
然后我有两个具体的实现:
m_vecElements
以上内容无法编译,因为const std::vector<CConcreteElement *>
的类型为const std::vector<IElement *>
,而返回值应该为IElement
类型。显然,当C ++ CConcreteElement
和return static_cast<const std::vector<IElement *>>(m_vecElements);
作为模板参数出现时,它们并没有关联。
我也尝试过:
.eslintrc
但这也不编译。有什么想法可以使它起作用吗?
答案 0 :(得分:2)
您无法执行此强制转换,因为std::vector
的元素类型是不变,这意味着,即使向量之间的关系相关,不同向量之间也没有关系(在继承意义上)。有关类型差异的更多信息,请参见this article。
简短的答案是,您无法使用std::vector
来执行此操作,但是可以通过提供 element getter 来代替 all elements getter :
class IContainer
{
public:
virtual ~IContainer() {}
virtual const IElement *element(size_t index) const = 0;
};
class CConcreteContainer: public IContainer
{
private:
std::vector<CConcreteElement *> m_vecElements;
public:
virtual ~CConcreteContainer() {}
virtual const CConcreteElement *element(size_t index) const override
{
return m_vecElements[index];
}
};
请注意,覆盖方法的返回类型与基本方法不同。这是可能的,因为C ++支持协变返回类型。