看下面代码,输出结果。
#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。