考虑以下简单代码:

class A {
};

class V1: vector<A *>{
  // my nice functions
};

如果我有V1的实例,则可以将任何从A派生的对象插入 vector 中,好的。

现在,假设我有两个简单的类,分别称为B和C,它们均从A派生;
如果我有V1的实例,那么B和C的两个指针都可以插入到此 vector 中,我想这是对的吗?

如果是这样,如何从V1导出 vector 以确保仅插入B指针?
我当时正在考虑使用模板,但是在这种情况下,我已经知道该类的基础,并且在临时模板中,您可以使用任何东西,对吗?

不知道我是否清楚,我的英语没有帮助...
我是否必须重写push_back和其他函数来检查模板参数是否源自A?

拜托,不需要谈论我正在使用的boost或语法等等。我真的只想了解它的概念。我对此有一些答案,但我想它们涉及太多的强制转换无法检查内容,我来这里是为了了解是否有更好的答案...

谢谢!
乔纳森

ps:你们能回答我发表的评论吗?有时我在这里问问题,然后最好的回答者来了又不回来:(。或者我应该问另一个问题而不是评论问题?

最佳答案

从您的示例尚不清楚是否需要继承。您可能还没有意识到这很危险,因为std::vector没有虚拟析构函数。这意味着在删除指向基类的指针时将不会调用V1的析构函数,并且您可能最终会泄漏内存/资源。有关更多信息,请参见here

class A {
};

class V1: vector<A *>{
  // my nice functions
};



是,对的。



是,对的。



为什么不使用
std::vector<B*> m_bVector;

对于这种情况?运作方式如下:
B* bInstance = new B();
A* aInstance = new A();
m_bVector.push_back(bInstance);
m_bVector.push_back(aInstance); //< compiler error

也许您有充分的理由从vector继承,但是我现在看不到...如果您需要其他功能,最好让V1包装std::vector,即:
class V1
{
private:
   std::vector<A*> m_aVec;
public:
   // use AVec
}

10-07 12:17
查看更多