为什么要调用基函数?

bra*_*ter 0 c++ constructor virtual-functions vtable

在以下代码中:

#include <iostream>
using namespace std;

class A {
    public:
    A() {
        cout << " A constructor \n";
        sum(2,4);
    }
    virtual int sum(int a, int b){
        cout << "Base sum \n";
        return a + b;
    }
};

class B : public A {
    public:
    B() : A() {
        cout << " B constructor \n";
    }

    int sum(int a, int b){
        cout << "Overloaded sum \n";
        return (a + b) * 10;
    }
};

int main(){
    A* a = new B();
    // a->sum(4,5);
}
Run Code Online (Sandbox Code Playgroud)

为什么即使我将A标记为虚拟并在B中重载它,也会调用A的总和?在运行时,在vtable的帮助下不应该调用B :: sum()吗?

Luc*_*ore 5

因为当你调用方法时,a它还不是类型的对象B.

避免virtual从构造函数调用方法:它会导致意外的结果(当然,除非你期望这种确切的行为,在这种情况下你会被发现).

在运行时,在vtable的帮助下不应该调用B :: sum()吗?

不是真的,因为对象不具备vtableB,在这一点上.

  • 并且为了完整性,类似的东西适用于从析构函数进行此类调用. (2认同)
  • @brainydexter看到这个[Scott Meyers链接](http://www.artima.com/cppsource/nevercall.html).基本上,当你到达基类析构函数时,派生对象就不再存在了. (2认同)