【发布时间】:2016-04-09 16:12:20
【问题描述】:
class A{
int i;
public:
A():i(0){cout<<" A : "<<i<<endl;}
A(int a);
virtual int val(){ return i+1; }
};
class B :public A{
int i;
public:
B():A(),i(0){cout<<" B : "<<i<<endl;}
B(int a):A(a),i(a) {
}
int val(){ return i;}
};
A::A(int a):i(a){
cout<<" A ; "<<i<<endl;
A* ap = new B;
cout<<" from A "<<ap->val()<<endl; ///expect 1 but got 0;
}
int main(){
A a(5);
}
我希望调用 ap->val() 的返回值为 1,因为我认为虚拟机制在构造函数中不起作用,但在这里我得到的值为 0,因为 ap->val() 导致调用 B::val()。为什么?
【问题讨论】:
-
一个; 5 A : 0 B : 0 from A 0 这是跑出来的
-
ap->val()在val的构造中没有被调用 -
您使用
new B实例化它,所以它是B的实例,而不是A。当您调用val()时,它使用实际类型,而不是声明类型。 -
投反对票,因为这实际上是一个研究不足的问题。
标签: c++