多态易错题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
原创粉丝点击