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

标签 c++ inheritance polymorphism

我已经搜索了问题,查看了论坛、书籍等。我可以识别方法的多态行为,并且有很多简单的示例在编译或运行时确定调用的方法。但是我对这段代码感到困惑,其中类 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/

相关文章:

c++ - 字符串中的匹配序列

C++ 将数据从浮点 vector 复制到浮点对 vector

c++ - 这段代码是否遵循递归的定义?

python-3.x - 如何在python3中子类化complex

python - 当我不能使用 self 时如何上课 - Python

arrays - Haskell 多态数组操作

java - 多态性 1 父类(super class) 4 子类

c++ - 计算数组中的元素重复了多少次

c# - Web Api JSON 中丢失的 EF TPH 继承

c++ - 工厂设计模式中的纯虚函数错误