在以下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()吗?
答案 0 :(得分:5)
因为在您调用方法时,a
还不是B
类型的对象。
避免从构造函数调用virtual
方法:它会导致意外的结果(当然,除非你期望这种确切的行为,在这种情况下你会被发现)。
在运行时,在vtable的帮助下不应该调用B :: sum()吗?
不是真的,因为此时该对象没有vtable
B
。
答案 1 :(得分:0)
在实例化派生类时,首先执行基础构造函数。这意味着在执行基础构造函数时,派生对象的构造尚未完成。
通过将构造函数中的操作限制为预期内容来避免这些情况:初始化对象。