gpt4 book ai didi

函数重载的 C++ 后期绑定(bind)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:37 24 4
gpt4 key购买 nike

假设我有这两个类:

class Hello {
//members
public:
virtual int doit() {
return 3;
}

};

class Wow : public Hello {
//members
public:
virtual int doit() {
return 2;
}
};

int main(int argc, const char *argv[]) {

Hello *c = new Wow();

return c->doit();
}

众所周知,这段代码将由 C++ 中的后期绑定(bind)处理,由 Clang 在 LLVM IR 中实现,如下所示:

 ; ...
%7 = bitcast %class.Wow* %5 to %class.Hello*
store %class.Hello* %7, %class.Hello** %c, align 8
%8 = load %class.Hello*, %class.Hello** %c, align 8
%9 = bitcast %class.Hello* %8 to i32 (%class.Hello*)***
%10 = load i32 (%class.Hello*)**, i32 (%class.Hello*)*** %9, align 8
%11 = getelementptr inbounds i32 (%class.Hello*)*, i32 (%class.Hello*)** %10, i64 0
%12 = load i32 (%class.Hello*)*, i32 (%class.Hello*)** %11, align 8
%13 = call i32 %12(%class.Hello* %8)
; ...

我的问题是,如果我想在另一个命名空间中创建一个名为 check 的函数,例如:

namespace somewhereelse {
void check(Hello *c) {
// Do something
}
void check(Wow *c) {
// Do something else
}
}

是否可以将一种后期绑定(bind)应用于不同的函数重载?

最佳答案

不,非成员函数的动态调度目前不是 C++ 的一部分。

这在理论上是可行的,但实现技术并不像虚函数那样直接。已经有多个提议以此来扩展 C++(关键字:多重方法和多重分派(dispatch)),但到目前为止,它们还没有产生具体的建议和接受的语言更改。

关于函数重载的 C++ 后期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37170793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com