#include<iostream>
using namespace std;
/* 请在这里填写答案 */
class Pig{
public:
Pig() {
cout << "Pig 申请了空间..." << endl;
}
virtual void climb() {
cout << "我只是个平凡的猪猪。" << endl;
}
virtual ~Pig() {
cout << "Pig 释放了空间..." << endl;
};
};
class MagicPig :public Pig {
public:
MagicPig() {
cout << "MagicPig 申请了空间..." << endl;
};
void climb(){
cout << "我能上树了耶!" << endl;
}
virtual ~MagicPig() {
cout << "MagicPig 释放了空间..." << endl;
};
};
int main()
{
Pig *p1 = new Pig;
Pig *p2 = new MagicPig;
cout << endl;
p1->climb();
p2->climb();
cout << endl;
delete p1;
delete p2;
return 0;
}
下面是代码执行过程中发生的情况:
-
Pig *p1 = new Pig;
:这里创建了一个Pig
对象,并调用了Pig
的构造函数,输出了 "Pig 申请了空间..."。 -
Pig *p2 = new MagicPig;
:这里创建了一个MagicPig
对象(它是Pig
的子类),但是通过基类指针p2
来指向它。这里首先会调用MagicPig
的构造函数,但是由于MagicPig
的构造函数没有显式调用基类的构造函数,所以编译器会隐式调用Pig
的默认构造函数,输出了 "Pig 申请了空间..."(注意这里并不是第二次输出 "Pig 申请了空间...",而是为MagicPig
对象中的Pig
部分调用了构造函数)。接着,MagicPig
的构造函数体执行,输出了 "MagicPig 申请了空间..."。 -
p1->climb();
:这里调用了p1
所指向的Pig
对象的climb
方法,输出了 "我只是个平凡的猪猪。"。 -
p2->climb();
:由于p2
实际上指向的是一个MagicPig
对象,这里会调用MagicPig
的climb
方法(由于MagicPig
重写了Pig
的climb
方法),输出了 "我能上树了耶!"。 -
delete p1;
:这里删除了p1
所指向的Pig
对象,调用了Pig
的析构函数,输出了 "Pig 释放了空间..."。 -
delete p2;
:这里删除了p2
所指向的MagicPig
对象。首先会调用MagicPig
的析构函数,输出 "MagicPig 释放了空间..."。接着,由于MagicPig
继承自Pig
,编译器会隐式调用Pig
的析构函数来清理MagicPig
对象中的Pig
部分,输出了 "Pig 释放了空间..."。