【问题标题】:c++ 11 =default keyword on virtual function for specifying default pure implementationc++ 11 =用于指定默认纯实现的虚函数上的默认关键字
【发布时间】:2016-09-08 13:06:42
【问题描述】:

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

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

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

void A :: tst () {}

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

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

很抱歉询问 c++ 标准委员会人员可能会或可能不会想到的问题,但是也许堆栈溢出的人会对以这种方式使用 default 关键字的不切实际有一些智慧,这将是很有趣。

谢谢!

【问题讨论】:

  • 默认情况下,子类共享父类的实现而不编写任何内容,假设子类非私有地从父类继承。那么,在这种情况下,你想让= default 意味着什么?
  • 当虚函数是纯的时,我们要求派生类选择一个实现。派生类可以提供实现或选择在基类中调用默认实现。然而,= default 可能允许派生指定基本默认值,只是由编译器加载到 vtable 中,与分派到转身并回调默认基本实现的派生实现相比,这可能更有效。然而,我确实认为在编译时选择派生类是一个重要的设计选择。

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


【解决方案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) — 具有相同的声明函数类型(除了可能不同的引用限定符和在 在复制构造函数或复制赋值运算符的情况下,参数类型可能是“引用 non-const T”,其中 T 是成员函数的类的名称),就好像它已被隐式声明一样, 和

(1.3) — 没有默认参数

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

现在将一个类的成员函数(例如,class A)指定为纯虚函数意味着从该类继承的任何类并且您不希望它也是抽象的,都必须覆盖该成员函数。

【讨论】:

  • 好的,标准说不支持这种类型的纯基类默认实现选择行为,但是人们很好奇为什么不支持
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2017-09-09
  • 2012-07-14
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多