哪些功能是动态调度的?

Moa*_*nti 2 c++ polymorphism inheritance

我搜索过问题,查看论坛,书籍等等.我可以识别方法的多态行为,并且在编译或运行时决定调用的方法时有很多简单的例子.但我对此代码感到困惑,其中C类继承自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);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

许多示例告诉(并且很明显)发生了多态行为,并且在运行时决定在执行以下行时调用哪个方法:

obja->change(5);
Run Code Online (Sandbox Code Playgroud)

但我的问题是:

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

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

    objc->change(5);
    
    Run Code Online (Sandbox Code Playgroud)

由于指针变量的类声明与对象相同,是否应该在编译运行时决定调用方法?

Nem*_*emo 5

如果编译器可以在编译时推断出实际类型,则可以避免虚函数调度.但它只能在证明行为等同于运行时调度时才能这样做.这是否发生取决于您的特定编译器的智能程度.

真正的问题是,你为什么关心?您显然理解调用虚函数的规则,并且行为的语义始终是运行时调度的语义,因此它对您编写代码的方式没有任何影响.