c++中一个派生类类创建了派生类的构造函数后还可以创建其他的构造函数(以自己的数据成员为参数的带参构造函数或无参构造函数)吗
构造函数是为了初始化用的,你已经执行了一个构造函数,为什么还要再执行另一个构造函数
如果你需要给变量赋值,那你赋值就好了呀
基类的构造函数只对基类的数据成员进行初始化,派生类的构造函数只对派生类新增的数据成员进行初始化,同时也会调用基类的构造函数。
用派生类建立一个对象时,执行构造函数的顺序是:先调用基类的构造函数,再执行派生类构造函数本身。
释放对象时,执行析构函数的顺序是:先调用子类的析构函数,再调用基类的析构函数
定义基类:
class A
{
public:
A()
{
cout << "AA" << endl;
}
~A()
{
cout << "~AA" << endl;
}
};
定义子类:
class B :public A
{
public:
B()
{
cout << "BB" << endl;
}
~B()
{
cout << "~BB" << endl;
}
};
建立基类对象,调用基类的构造函数:
A* pA = new A();//输出AA
释放基类对象,调用基类的析构函数:
delete pA; //输出~AA
建立子类对象,先调用基类的构造函数,再执行子类的构造函数
B* pB = new B();//先调用基类的构造函数,输出AA,再调用子类的构造函数,输出BB
释放子类对象,先调用子类的析构函数,再调用基类的析构函数
delete pB; //先调用子类的析构函数,输出~BB,再调用基类的析构函数,输出~AA
main函数:
int main()
{
A* pA = new A();//输出AA
delete pA; //输出~AA
B* pB = new B();//
delete pB;
return 0;
}
执行结果:
基类指针指向子类对象,先调用基类的构造函数,再执行子类构造函数
pA = new B();//先调用基类的构造函数输出AA,再调用子类的构造函数,输出BB
释放指针,这里只调用了基类的析构函数,子类的析构函数并没有调用。按理说是要调用子类的析构函数的,那么这就有问题了。该怎么解决呢?就是在基类中定义虚析构函数
delete pA; //输出~AA
在基类中定义虚析构函数
class A
{
public:
A()
{
cout << "AA" << endl;
}
virtual ~A()
{
cout << "~AA" << endl;
}
};
子类
class B :public A
{
public:
B()
{
cout << "BB" << endl;
}
~B()
{
cout << "~BB" << endl;
}
};
将基类指针指向子类对象,释放基类指针时,就会先调用子类的析构函数,再调用基类的析构函数。
int main()
{
A* pA = new A();//输出AA
pA = new B();//基类指针指向子类对象,先调用基类的构造函数输出AA,再调用子类的构造函数,输出BB
delete pA;
return 0;
}
此时的执行结果为: