0

在以下代码中:

#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 的 sum 标记为虚拟并在 B 中重载它,也会调用它?在运行时,不应该在 vtable 的帮助下调用 B::sum() 吗?

4

2 回答 2

5

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

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

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

不是真的,因为该对象当时没有vtableof B

于 2012-08-09T05:53:32.973 回答
0

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

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

于 2012-08-09T05:59:26.613 回答