在C++类的继承中, 子类不仅要继承父类的属性和方法,而且还要继承其构造函数和析构函数。本文将详细讲解在C++类继承时的构造函数。
构造函数和析构函数的继承规则
在C++中,子类的构造函数和析构函数会默认调用父类的构造函数和析构函数。具体规则如下:
- 子类的构造函数会默认调用父类的无参构造函数。
如果父类没有无参构造函数,则必须在子类的构造函数中显示的调用父类的有参构造函数。
- 子类的析构函数会默认调用父类的析构函数。
如果父类有虚析构函数,则子类的析构函数也要声明为虚函数。
举个栗子:
class Person{
public:
Person(){
cout << "Person's constructor is called!" << endl;
}
~Person(){
cout << "Person's destructor is called!" << endl;
}
};
class Student:public Person{
public:
Student(){
cout << "Student's constructor is called!" << endl;
}
~Student(){
cout << "Student's destructor is called!" << endl;
}
};
int main(){
Student s;
return 0;
}
在这个例子中,子类Student继承了Person类,主函数中创建了一个Student对象s。当构造函数调用完毕时,输出的结果如下:
Person's constructor is called!
Student's constructor is called!
Student's destructor is called!
Person's destructor is called!
可以看到,构造函数和析构函数都按照继承规则调用了。
类构造函数的重载
当子类调用父类的构造函数时,可以选择调用有参构造函数或者无参构造函数。
子类的构造函数可以重载父类的构造函数。当然,这时需要在子类的构造函数中显示调用父类的构造函数,以保证父类的成员变量正常赋值。
举个栗子:在上面的示例中,如果我们要给Person类添加一个name成员变量,使得在子类构造时可以赋值,那么可以这么写:
class Person{
public:
string name;
Person(){
cout << "Person's default constructor is called!" << endl;
}
Person(string n){
name = n;
cout << "Person's constructor with parameter " << name << " is called!" << endl;
}
~Person(){
cout << "Person's destructor is called!" << endl;
}
};
class Student:public Person{
public:
Student(){
cout << "Student's default constructor is called!" << endl;
}
Student(string n):Person(n){
cout << "Student's constructor with parameter " << n << " is called!" << endl;
}
~Student(){
cout << "Student's destructor is called!" << endl;
}
};
int main(){
Student s("Jack");
cout << s.name << endl;
return 0;
}
在这个例子中,Person类添加了一个string类型的name成员变量。在Student类中,重载了Person类的构造函数,以接受name参数。在构造子类对象时,可以直接调用带参数的构造函数,同时给成员变量name赋值。
输出的结果如下:
Person's constructor with parameter Jack is called!
Student's constructor with parameter Jack is called!
Jack
Student's destructor is called!
Person's destructor is called!
可以看到,name成员变量成功赋值。同时,子类和父类的构造函数和析构函数都按照规则正常调用了。
结论
在C++类继承时的构造函数中,必须要遵守一些继承规则,包括子类继承了父类的构造函数,子类构造函数默认调用父类构造函数等。同时,为了让子类拥有一些自己的特性,可以在子类的构造函数中重载父类的构造函数,在构造子类对象时可以自己传递参数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类继承时的构造函数 - Python技术站