考虑以下简单代码:
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
}