c ++ 11 =虚函数上的默认关键字,用于指定默认的纯实现

时间:2016-05-12 15:24:25

标签: c++11 default keyword pure-virtual

我很好奇为什么在C ++ 11中,在派生虚方法上使用“= default”不会选择纯基类实现。

例如,以下测试代码生成消息“error:'virtual void B :: tst()'不能从”g ++ -std = c ++ 11“中默认为”。

struct A {
  virtual ~A () = default;
  virtual void tst () = 0;
};

void A :: tst () {}

struct B : public A {
  virtual void tst () = default;
};

我们当然可以提供一个调用默认基本实现的B :: tst,但是有一个人担心,与假设的“基于默认”的编码相比,这可能是更高的开销实现。

很抱歉提出有关c ++标准委员会成员心中可能会有什么内容的问题,但是也许有人在堆栈溢出时可能会有一些关于以这种方式使用default关键字的不切实际的智慧很有意思。

谢谢!

1 个答案:

答案 0 :(得分:1)

根据标准§8.4.2/ p1明确违约的函数[dcl.fct.def.default] Emphasis Mine ):

  

表单的函数定义:

     

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt = default;

     

被称为明确默认的定义。一个功能   明确默认

     

(1.1) - 是一个特殊的成员函数,

     

(1.2) - 具有相同的声明函数类型(除了可能不同的ref限定符之外,除了in   在复制构造函数或复制赋值运算符的情况下,参数类型可以是“引用”   非const T“,其中T是成员函数类的名称),就像它已被隐式声明一样,   和

     

(1.3) - 没有默认参数

成员函数tst()不是special member function。因此,它不能被默认。

现在将类的成员函数(例如,class A)指定为纯虚拟,需要从该类继承的任何类,并且您不希望它是抽象的,也必须覆盖该成员功能