我有这样的设置:
abstract class Foo {}
class Bar : Foo {}
Run Code Online (Sandbox Code Playgroud)
和其他形式的方法:
void AddEntries(List<Foo>) {}
Run Code Online (Sandbox Code Playgroud)
我试图使用类型对象列表调用此方法 Bar
List<Bar> barList = new List<Bar>()
AddEntries(barList);
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
无法从List <Bar>转换为List <Foo>
反正这个问题呢?我需要使用抽象类来保持方法定义.
我正在尝试编写一个函数,make_foo,它将“解开” a std::optional< foo >,返回包含的值。该函数假定可选的已启用,因此不会对optional.
我的实现如下,以及编译后的程序集以供参考。我有几个关于编译器输出的问题:
为什么这会导致代码分支?optional::operator*提供对包含值的未经检查的访问,所以我不希望看到任何分支。
为什么foo会调用析构函数?注意on_destroy()程序集中的调用。我们如何在不调用析构函数的情况下将包含的值移出可选项?
#include <optional>
extern void on_destroy();
class foo {
public:
~foo() { on_destroy(); }
};
extern std::optional< foo > foo_factory();
// Pre-condition: Call to foo_factory() will not return nullopt
foo make_foo() {
return *foo_factory();
}
Run Code Online (Sandbox Code Playgroud)
make_foo(): # @make_foo()
push rbx
sub rsp, 16
mov rbx, rdi
lea rdi, [rsp + 8]
call foo_factory()
cmp byte …Run Code Online (Sandbox Code Playgroud)