大家分析一下这段代码的输出,偶想不明白,请高手指教
#include <iostream>
using namespace std;
class base1
{
public:
~base1(){}
virtual void print(){cout < < "base1 print funtion. " < <endl;}
};
class derived1:public base1
{
public:
virtual void print(){cout < < "derived1 print funtion. " < <endl;}
};
class base2
{
public:
virtual void print(){cout < < "base2 print funtion. " < <endl;}
};
class derived2:public base2
{
public:
virtual void print(){cout < < "derived2 print funtion. " < <endl;}
};
int main()
{
base1* p1=&derived1();
p1-> print();
base2* p2=&derived2();
p2-> print();
return 0;
}
[解决办法]
#include "stdafx.h "
#include <iostream>
using namespace std;
class base1
{
public:
base1(){cout < < "base1 ctor " < < endl;}
~base1(){cout < < "base1 dtor " < < endl;}
virtual void print(){cout < < "base1 print funtion. " < <endl;}
};
class derived1:public base1
{
public:
derived1(){cout < < "derived1 ctor " < < endl;}
~derived1(){cout < < "derived1 dtor " < < endl;}
virtual void print(){cout < < "derived1 print funtion. " < <endl;}
};
class base2
{
public:
virtual void print(){cout < < "base2 print funtion. " < <endl;}
base2(){cout < < "base2 ctor " < < endl;}
//~base2(){cout < < "base2 dtor " < < endl;}
};
class derived2:public base2
{
public:
virtual void print(){cout < < "derived2 print funtion. " < <endl;}
derived2(){cout < < "derived2 ctor " < < endl;}
~derived2(){cout < < "derived2 dtor " < < endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
base1* p1=&derived1();
p1-> print();
base2* p2=&derived2();
p2-> print();
return 0;
}
结果
base1 ctor
derived1 ctor
derived1 dtor
base1 dtor
base1 print funtion.
base2 ctor
derived2 ctor
derived2 dtor
derived2 print funtion.
Press any key to continue
可能是这样得:
base1* p1=&derived1();
如果base1类和derived1类得构造函数和析构函数都显式定义的话derived1()调用它们的顺序是base1的ctor derived1的ctor derived1的dtor base1的dtor.
楼主的程序中base1的dtor是显式定义的,就是说derived1()最后调用了base1的dtor,所以p1并没有转换成子类的类型.
这明显是一道应试题.楼主只要明白类的继承和虚函数的作用就可以了. base1* p1=&derived1()这种形式我从来没见过.应为在赋值前对象就已经调用析构函数了,这样的指针很危险.一般情况都是用new 和 delete关键字来为对象指针分配空间.或者用auto_prt