我很好奇为什么在C++11中,在派生的虚拟方法上使用"=default"不能选择纯基类实现。
例如,以下测试代码从"g++-std=c++11"中生成消息"error:'virtual void B::tst()'cannot be default"。
struct A {
virtual ~A () = default;
virtual void tst () = 0;
};
void A :: tst () {}
struct B : public A {
virtual void tst () = default;
};
当然,我们可以提供一个调用默认基本实现的B::tst,但人们担心,与假设的基于"=default"的编码相比,这可能是更高的开销实现。
很抱歉问一些关于c++标准委员会人员可能会想到什么或可能不会想到什么的问题,但尽管如此,也许栈溢出的某个人会有一些智慧,认为以这种方式使用默认关键字是不切实际的,这会很有意思。
谢谢!
根据标准§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限定符和在复制构造函数或复制赋值运算符的情况下,参数类型可以是"引用非常数T",其中T是成员函数类的名称),就好像它是隐式声明的一样,和
(1.3)--没有默认参数
成员函数tst()
不是一个特殊的成员函数。因此,它不能被默认。
现在,将一个类(例如class A
)的成员函数指定为纯虚拟,意味着从该类继承的任何类(您不希望它也是抽象的)都必须覆盖该成员函数。