【发布时间】: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