多态易错题2
来源:互联网 发布:go并发编程实战 高清 编辑:程序博客网 时间:2024/05/22 14:05
看下面代码,输出结果。
#include<iostream>#include<vld.h>using namespace std;class Base{private : int ma;public: Base(int n):ma(n){cout<<"Base()"<<endl;}//构造函数 void virtual show(int i=100){cout<<"Base()"<<"i = "<<i<<endl;} virtual ~Base(){cout<<"~Base"<<endl;}//析构函数};class Derive: public Base{private : int mb;public: Derive(int n):Base(n){cout<<"Derive()"<<endl;}//构造函数 void show( int i=200){cout<<"derive()"<<"i ="<<i<<endl;} ~Derive(){cout<<"~Derive()"<<endl;}//析构函数};int main(){ Base*p = new Derive(10); p->show(); delete p; return 0;}
请问输出的i 是多少?
Base()
Derive()
derive()i =100
~Derive()
~Base
请按任意键继续…
由于在base里有虚函数,故基类对象内存有vfptr(虚函数表指针)指向虚函数,基类指针指向了派生类的对象,产生了多态,p调用的是派生类的show();但默认参数的压栈,是在编译的时候,就已经确定的。编译的时候,编译器看q是base类型的,压i= 100, 但是运行时多态调用的show是派生类的,使用的i已经压栈,
于是就打印100。
0 0