构造函数中的虚拟调用
Virtual call in constructor
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((。为什么?
在此构造函数中
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;
}
函数调用ap->val()
不会应用于正在构造的对象。
在此声明中
A* ap = new B;
类型 B
的对象已使用其自己的构造函数调用创建,并且函数调用将应用于已创建的类型 B 的对象。
相关文章:
- 是否可以使用函数指针调用虚拟析构函数?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 使用在堆栈上创建的对象调用虚拟函数
- 如何从派生类函数中调用虚拟函数
- 从内部类的析构函数调用虚拟函数
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 调用虚拟成员类的方法
- 为什么不调用虚拟基非默认构造函数,除非大多数派生基显式调用它们?
- 为什么在运行时调用虚拟函数时需要虚拟表
- 从C++中的虚拟析构函数调用虚拟方法
- 如何在C++中调用虚拟析构函数
- 调用虚拟函数而不通过类类型指针创建任何对象
- 通过命名成员调用虚拟与地址或引用的区别
- 从派生的指针中调用虚拟功能,而无需支付VTable价格
- 为什么我不能从铸造的字节(char)数组中调用虚拟函数
- 在基类崩溃中调用虚拟功能
- 可以通过跨二进制边界传递的对象上的接口调用虚拟函数吗?
- 调用虚拟方法的不同方法
- C++未根据需要调用虚拟方法