带指针的C++ STL容器:几个问题

Kom*_*ave 4 c++ pointers stl subclass

比方说,你有型T和亚型TSub1,TSub2等等.

其中一些子类型已初始化new TSub(...).然后将结果指针存储为以下元素:

list<T*> tsList;
Run Code Online (Sandbox Code Playgroud)

相同的指针也用作键:

map<T*,V> tsMap;
Run Code Online (Sandbox Code Playgroud)

现在考虑使用迭代tsList器变量进行迭代tIter.

这是我的问题:

  1. tsMap[*tIter]tsMap.find(*tIter)这两个成功找到正确关联的值?

  2. 即使STL将类型视为 ?,是否会delete *tIter成功释放为相关分配的完整内存块?TSubT

  3. 假设有一个已定义的方法T::foo()和覆盖TSub::foo().

    (*tIter)->foo()打电话T::foo()还是TSub::foo()

上下文是:每个TSub都希望以单例方式实例化,但是以允许迭代考虑作为超类型的方式存储,其中调用子类中的方法.

我非常感谢一个明智的解释.感谢您的时间!

Arm*_*yan 6

tsMap [*tIter]和tsMap.find(*tIter)都能成功找到正确的关联值吗?

是的,但如果找不到密钥,tsMap [*tIter]将创建一个默认值.

即使STL将类型视为T,delete*tIter是否会成功释放为相关TSub分配的完整内存块?

当且仅当T的析构函数是虚拟的

假设有一个已定义的方法T :: foo()并覆盖TSub :: foo().

将(*tIter) - > foo()调用T :: foo()或TSub :: foo()?

如果T :: foo不是虚拟的,它将调用T :: foo.否则它将调用TSub :: foo()