gpt4 book ai didi

c++重载和覆盖解析时间

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:29 25 4
gpt4 key购买 nike

为什么覆盖在运行时解决,而重载在编译时解决?
是否有任何理由无法在编译时解决覆盖问题。

最佳答案

is there any reason that overriding cant be resolved at compile time.

假设你在谈论多态性,即

#include <iostream>

class Base
{
public:
virtual void Foo()
{
std::cout << "Base::Foo()" << std::endl;
}
};

class Derived : public Base
{
public:
virtual void Foo()
{
std::cout << "Derived::Foo()" << std::endl;
}
};

上面的代码允许这样的事情按预期工作:

void CallFoo(Base& b)
{
b.Foo();
}

int main()
{
Base b;
Derived d;
CallFoo(b); // calls Base::Foo()
CallFoo(d); // Calls Derived::Foo();
}

重要的是要认识到 CallFoo()b 实际上是什么一无所知(它可能指的是 Base 实例或到 Derived 实例)。所有 CallFoo() 获取的都是对 Base 的引用,它没有说明它实际指的是什么,因此编译器在编译时无法知道它是什么 CallFoo()。因此,确定是否应该调用 Base::Foo()Derived::Foo() 必然是一个运行时决定。

删除 virtual 关键字(以禁用覆盖)将导致上面的代码打印出 Base::Foo() 两次,而不是 Base::Foo () 然后是 Derived::Foo()。这是因为如果没有 virtual 关键字,编译器将在编译时简单地解析对 Base::Foo() 的调用。

话虽这么说,因为虚函数会产生一些开销(毕竟,需要调用正确的函数是运行时决定的),编译器会尽力找出 b 的实际类型> 如果可以,在 CallFoo() 中。在那种情况下,它变成了编译时的决定。然而,它是一个实现细节。

关于c++重载和覆盖解析时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9918565/

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