破坏者可能是最终的吗?

时间:2017-11-29 15:27:12

标签: c++ c++11 inheritance destructor

C ++标准是否允许将析构函数声明为# Select samples from same class same_match = tf.equal(match_ids, match_id) same_class = tf.equal(class_ids, class_id) positive = tf.logical_and(same_match, same_class) negative = tf.logical_not(positive) samples_pos = tf.boolean_mask(f_anchor, tf.squeeze(positive)) samples_neg = tf.boolean_mask(f_anchor, tf.squeeze(negative)) ?像这样:

final

如果是这样,那是否会阻止派生类的声明:

 class Derived: public Base
 {
      ...
      virtual ~Derived() final;
 }

如果允许 ,编译器是否可能发出警告?声明析构函数是 class FurtherDerived: public Derived {// allowed? } 一个可行的习惯用语,用于表明某个类不打算用作基类?

(有no point in doing this in a ultimate base class,只有派生类。)

1 个答案:

答案 0 :(得分:57)

  

可以将C ++析构函数声明为final吗?

  

如果是这样,那是否会阻止派生类的声明:

是的,因为派生类必须声明析构函数(由您明确地或由编译器隐式地),并且析构函数将覆盖声明为final的函数,该函数是格式错误的。

规则为[class.virtual]/4

  

如果某个B类中的虚函数f标有 virt-specifier final,并且在从B派生的D类中标有函数D​::​f覆盖B​::​f,该程序格式不正确。

它的衍生本身是不正确的,不必使用它。

  

声明析构函数是最终的可行成语,用于指示某个类不打算用作基类?

实际上,您应该只标记班级final。它更加明确。