为什么std :: unary_function不包含虚析构函数

rav*_*avi 4 c++ virtual destructor

我遇到了课堂模板std::unary_functionstd::binary_function.

template <class Arg, class Result>
struct unary_function {
    typedef Arg argument_type;
    typedef Result result_type;
};

template <class Arg1, class Arg2, class Result>
struct binary_function {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};
Run Code Online (Sandbox Code Playgroud)

这两者都可以用作特定目的的基类.但仍然没有虚拟析构函数.我可以猜到的一个原因是这些并不意味着要进行多态处理.即

std::unary_function* ptr; 
//intialize it 
//do something
delete ptr;
Run Code Online (Sandbox Code Playgroud)

但如果是这样的话,不应该在析构函数中使用protected访问说明符,这样编译器就会破坏任何尝试.

AnT*_*AnT 7

在一个均衡的C++设计理念中,"防止"某些事情发生的想法大多适用于很有可能发生意外和不易察觉的误用.即使在这种情况下,预防措施仅适用于未实施任何重大处罚的情况.这些类为目的unary_function,binary_function,iterator等应十分明确,谁知道他们.一个完全无能的用户将错误地使用它们.

如果类通过公共继承实现了"组成员注入"的既定惯用语,则向该组件添加虚拟析构函数将是一个主要的设计错误.将非多态类转换为多态类是一个重大的质变.为使用这个成语的能力付出这样的代价将是非常不可接受的.

一个非虚拟保护的析构函数是一个不同的故事...我不知道他们为什么不这样做.也许只是看起来不必要地过多地将成员函数添加到该目的(因为否则,这些类仅包含typedefs).

请注意,即使unary_function,binary_function已被弃用,iterator是不是.弃用不针对习语本身.这个成语广泛用于其他大型设计方法,如Mixins的 C++实现等.