- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑一个程序,它有一个 Foo
类,其中包含一个声明如下的函数 Foo::fn
:
virtual void fn();
Foo
的子类 Bar
。将像这样声明 Bar::fn
:
virtual void fn() override final;
导致 Bar
或 Bar
的子类中对 fn
的调用更加高效,或者它只是保留 的子类禁止
覆盖 fn
?如果使用 final
使调用更高效,定义 Bar::fn
的最简单、最有效的方法是什么,使其功能与 Foo 完全相同: :fn
?
最佳答案
如果fn
定义为 final
在 Bar
, 编译器可以将调用分派(dispatch)给 fn
通过指针或对 Bar
的引用静态的,因为它知道 Bar::fn
是最终的重写。例如这个程序片段:
struct Foo {
virtual void fn();
};
struct Bar : Foo {
void fn() final override;
};
void with_foo(Foo& o) { o.fn(); }
void with_bar(Bar& o) { o.fn(); }
编译为(See gcc.godbolt.org for details):
with_foo(Foo&):
subq $8, %rsp
movq (%rdi), %rax
call *(%rax)
addq $8, %rsp
ret
with_bar(Bar&):
subq $8, %rsp
call Bar::fn()
addq $8, %rsp
ret
电话with_foo
通过 vtable 动态调度(call *(%rax)
是间接调用),但是 with_bar
中的调用静态发送到 Bar::fn()
.
最简单的制作方法Bar::fn
成为 Foo::fn
的最终覆盖者不改变行为是将其定义为静态调用 Foo::fn
:
struct Bar : Foo {
void fn() final override { Foo::fn(); }
};
关于c++ - 虚函数效率与 'final'关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332918/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!