gpt4 book ai didi

c++ - 哪些函数是动态调度的?

转载 作者:太空狗 更新时间:2023-10-29 23:47:15 24 4
gpt4 key购买 nike

我已经搜索了问题,查看了论坛、书籍等。我可以识别方法的多态行为,并且有很多简单的示例在编译或运行时确定调用的方法。但是我对这段代码感到困惑,其中类 C 继承自 B,而 B 又继承自 A:

class A {
protected:
int x;

public:
virtual void change() = 0;
virtual void change(int a) { x = a; }
};

class B : public A {
public:
void change() { x = 1; }
};

class C : public B {
public:
void change() { x = 2; }
void change(int a) { x = a*2; }
};

int main () {
B *objb = new B();
C *objc = new C();
A *obja;
objb->change();
obja = objc;
objc->change();
obja->change(5);
// ...
}

许多例子告诉(而且很清楚)发生了多态行为,并且在运行时决定在执行以下行时调用什么方法:

obja->change(5);

但我的问题是:

  1. 当我调用以下内容(从纯虚拟覆盖)时会发生什么?

    objb->change();
  2. 当我调用以下内容(从虚拟但非纯的覆盖)时会发生什么?

    objc->change(5);

既然指针变量的类声明与对象相同,那么方法调用应该在编译还是运行时来决定?

最佳答案

如果编译器可以在编译时推断出实际类型,就可以避免虚函数分派(dispatch)。但只有当它可以证明该行为等同于运行时分派(dispatch)时,它才能这样做。这是否会发生取决于您的特定编译器的智能程度。

真正的问题是,你为什么关心?您显然了解调用虚函数的规则,行为的语义始终是运行时分派(dispatch)的语义,因此它对您编写代码的方式应该没有影响。

关于c++ - 哪些函数是动态调度的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6586240/

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