派生类构造函数执行的次序
时间: 2023-10-13 11:04:38 浏览: 80
派生类构造函数的执行次序如下:
1. 首先会调用类的构造函数。如果有多个基类,它们的构造函数按照它们在派生类的声明出现的顺序依调用。
2.着会调用派生类自的构造函数。派类构造函数执行毕后,对象的构造过程完成。
需要注意的是,在派生类构造函数中,可以使用初始化列表来初始化基类的成员和派生类自身的成员。同时,派生类的析构函数执行的次序与构造函数相反,即先执行派生类的析构函数,再执行基类的析构函数。
相关问题
关于创建派生类对象时,构造函数的调用次序,以下正确的是 A. 最先调用虚基类的构造函数 B. 其次调用普通基类的构造函数,多基类按照初始化列表中的次序调用 C. 再次调用对象成员的构造函数,按类声明中对象成员出现的次序调用 D. 最后执行派生类的构造函数
B. 其次调用普通基类的构造函数,多基类按照初始化列表中的次序调用,C. 再次调用对象成员的构造函数,按类声明中对象成员出现的次序调用,D. 最后执行派生类的构造函数,是创建派生类对象时构造函数的调用顺序。虚基类的构造函数调用在普通基类的构造函数之后,但是它的调用时间和次数依赖于具体的继承关系和调用方式。
声明一个基类Shape(形状),其中包含一个方法来计算面积; 从Shape 派生两个类:Rectangle(矩形类)和Circle(圆形类); 从Rectangle 类派生正方形类Square; 分别实现派生类构造函数、析构函数及其它功能的成员函数; 创建各派生类的对象,观察构造函数、析构函数的调用次序; 计算不同对象的面积。
好的,这是一个经典的面向对象编程问题。以下是一个C++的示例代码:
```c++
#include <iostream>
using namespace std;
class Shape {
public:
virtual double area() {
return 0.0;
}
};
class Rectangle : public Shape {
protected:
double width, height;
public:
Rectangle(double w, double h) {
width = w;
height = h;
cout << "Rectangle constructed" << endl;
}
~Rectangle() {
cout << "Rectangle destructed" << endl;
}
double area() {
return width * height;
}
};
class Square : public Rectangle {
public:
Square(double w) : Rectangle(w, w) {
cout << "Square constructed" << endl;
}
~Square() {
cout << "Square destructed" << endl;
}
};
class Circle : public Shape {
protected:
double radius;
public:
Circle(double r) {
radius = r;
cout << "Circle constructed" << endl;
}
~Circle() {
cout << "Circle destructed" << endl;
}
double area() {
return 3.14 * radius * radius;
}
};
int main() {
Shape* shapes[3];
shapes[0] = new Rectangle(2, 3);
shapes[1] = new Circle(4);
shapes[2] = new Square(5);
for (int i = 0; i < 3; i++) {
cout << "Area of shape " << i << " is " << shapes[i]->area() << endl;
delete shapes[i];
}
return 0;
}
```
运行结果如下:
```
Rectangle constructed
Circle constructed
Rectangle constructed
Square constructed
Area of shape 0 is 6
Rectangle destructed
Area of shape 1 is 50.24
Circle destructed
Area of shape 2 is 25
Square destructed
Rectangle destructed
```
在这个示例代码中,我们定义了一个基类Shape,其中包含一个虚函数area(),用来计算面积。然后我们从Shape派生出两个类Rectangle和Circle,分别代表矩形和圆形。从Rectangle又派生出Square,代表正方形。每个类都有自己的构造函数和析构函数,用于初始化对象和在对象被销毁时释放资源。在主函数中,我们创建了三个Shape类型的指针,分别指向了一个Rectangle、一个Circle和一个Square对象。然后我们遍历指针数组,输出每个对象的面积,并逐个删除它们。输出结果显示了对象的创建和销毁顺序,以及它们的面积。
阅读全文