为什么要调用基函数?

时间:2012-08-09 05:50:54

标签: c++ constructor virtual-functions vtable

在以下code中:

#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);
}

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

2 个答案:

答案 0 :(得分:5)

因为在您调用方法时,a还不是B类型的对象。

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

  

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

不是真的,因为此时该对象没有vtable B

答案 1 :(得分:0)

在实例化派生类时,首先执行基础构造函数。这意味着在执行基础构造函数时,派生对象的构造尚未完成。

通过将构造函数中的操作限制为预期内容来避免这些情况:初始化对象。