去面试了几家公司,好像每家都出了类的调用,应该就是想考考继承和虚函数的用法。确实,不背出来,现场想还得花点时间。
#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"1"<<endl;}
~A(){cout<<"2"<<endl;}
virtual void print() {cout<<"this is A"<<endl;}
};
class B : public A
{
public:
B(){cout<<"3"<<endl;}
~B(){cout<<"4"<<endl;}
virtual void print() {cout<<"this is B"<<endl;}
};
class C : public B
{
public:
C(){cout<<"5"<<endl;}
~C(){cout<<"6"<<endl;}
virtual void print() {cout<<"this is C"<<endl;}
};
int main()
{
A *test = new A();
test->print();
test = new B();
test->print();
C *c = new C();
c->print();
delete test;
delete c;
return 0;
}
输出是:
1
this is A
1
3
this is B
1
3
5
this is C
2
6
4
2
首先用new会调用构造函数,输出1,和A的print(),基类指针可以指向子类的,因为是虚方法,所以调用了B的print,但为什么是1,3?先调用父类构造函数再调用子类的?用delete会调用析构函数,声明的是A类的指针,所以是2,delete c,出现6,4,2倒是好理解,构造函数的调用顺序是1.先调用基类构造函数2.按声明顺序初始化数据成员3.最后调用自己的构造函数。所以调用构造函数是1,3,5