我很好奇为什么在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关键字的不切实际的智慧很有意思。
谢谢!
答案 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
)指定为纯虚拟,需要从该类继承的任何类,并且您不希望它是抽象的,也必须覆盖该成员功能