C++ typedef与unlaborated继承

The*_*ran 8 c++ stl

我有一个由嵌套STL容器组成的数据结构:

typedef std::map<Solver::EnumValue, double> SmValueProb;
typedef std::map<Solver::VariableReference, Solver::EnumValue> SmGuard;
typedef std::map<SmGuard, SmValueProb> SmTransitions;
typedef std::map<Solver::EnumValue, SmTransitions> SmMachine;
Run Code Online (Sandbox Code Playgroud)

这种形式的数据仅在我的程序中短暂使用,除了简单地存储数据之外,附加到这些类型的行为并不多.但是,编译器(VC++ 2010)抱怨结果名称太长.

将类型重新定义为STL容器的子类而无需进一步详细说明似乎有效:

typedef std::map<Solver::EnumValue, double> SmValueProb;
class SmGuard : public std::map<Solver::VariableReference, Solver::EnumValue> { };
class SmTransitions : public std::map<SmGuard, SmValueProb> { };
class SmMachine : public std::map<Solver::EnumValue, SmTransitions> { };
Run Code Online (Sandbox Code Playgroud)

认识到STL容器不打算用作基类,在这种情况下是否存在任何危险?

Mat*_* M. 11

有一个危险:如果调用delete指向没有virtual析构函数的基类的指针,则会出现未定义的行为.否则,你很好.

至少那是理论.实际上,在MSVC ABI或Itanium ABI(gcc,Clang,icc,...)delete基类上没有虚拟析构函数(-Wdelete-non-virtual-dtor使用gcc和clang,提供类具有虚方法)只会导致问题,如果你的派生类使用非平凡的析构函数添加非静态属性(例如a std::string).

在你的具体情况下,这似乎很好......但......

...您可能仍希望封装(使用Composition)并公开有意义的(面向业务的)方法.它不仅危害性更小,而且比it->second.find('x')->begin()... 更容易理解