1、派生类的构造函数 class A{int a;public: A(int x=0){ ①;} };class B:public A{ int b;public: B(_②_,_③_): 4 5 }
时间: 2024-06-13 10:08:55 浏览: 15
派生类的构造函数可以通过初始化列表调用基类的构造函数来初始化从基类继承的成员变量,格式如下:
```
Derived(参数表):Base(参数表), member1(val1), member2(val2), ... {}
```
其中,参数表是指派生类构造函数的参数列表,Base(参数表)是指调用基类构造函数并传入参数表,member1(val1)、member2(val2)等是指初始化派生类新增的成员变量。在初始化列表中,基类构造函数的调用顺序与基类在派生类中的声明顺序一致,与初始化列表中的顺序无关。
根据提供的代码,可以得到以下答案:
```
class A{
int a;
public:
A(int x=0){
a = x;
}
};
class B:public A{
int b;
public:
B(int x=0, int y=0):A(x){
b = y;
}
};
```
在B的构造函数中,通过初始化列表调用A的构造函数,并传入参数x,然后再初始化b成员变量为y。
相关问题
#include <iostream> using namespace std; class Point{ public: Point(int x1); int getx() { return x; } protected: int x; }; Point::Point(int x1) { x=x1; cout<<"执行基类的构造函数"<<endl; } class Circle:public Point{ public: Circle(int x1,int y1); int gety() { return y; } protected: int y; }; Circle::Circle(int x1,int y1):Point(x1) { y=y1; cout<<"执行派生类的构造函数"<<endl; } int main() { Circle c(2,1); cout<<"x="<<c.getx<<endl; cout<<"y="<<c.gety<<endl; return 0; }
在 `main` 函数中调用 `getx` 函数时,应该加上括号,即 `c.getx()`,而不是 `c.getx`。请修改以下代码:
```c++
#include <iostream>
using namespace std;
class Point{
public:
Point(int x1);
int getx()
{
return x;
}
protected:
int x;
};
Point::Point(int x1) {
x=x1;
cout<<"执行基类的构造函数"<<endl;
}
class Circle:public Point{
public:
Circle(int x1,int y1);
int gety()
{
return y;
}
protected:
int y;
};
Circle::Circle(int x1,int y1):Point(x1) {
y=y1;
cout<<"执行派生类的构造函数"<<endl;
}
int main() {
Circle c(2,1);
cout<<"x="<<c.getx()<<endl; //注意这里调用 getx 函数时要加上括号
cout<<"y="<<c.gety()<<endl;
return 0;
}
```
class BC { public: BC(int a) { x = a; z = -1; } BC(int a1, int a2) { x= a1; z = a2; } private: int x, z; }; class DC : public BC { public: DC(int a) { y = a;} private: int y; };
这个程序定义了两个类BC和DC,其中类DC继承了类BC。类BC包含两个构造函数,一个接受一个int类型的参数a,另一个接受两个int类型的参数a1和a2。类BC还包含两个私有成员变量x和z,它们只能在类内部访问。类DC包含一个构造函数,它接受一个int类型的参数a,并调用其基类BC的构造函数BC(int a)来初始化基类部分。类DC还包含一个私有成员变量y,它只能在类内部访问。
这个程序的实现中没有明显的错误,但是可以考虑对其进行一些改进和完善,例如:
- 在类BC中,可以添加一个默认构造函数,以便在创建对象时可以使用默认构造函数进行初始化。
- 在类BC中,成员变量x和z可以声明为protected访问级别,以便在派生类中可以访问这些变量。
- 在类BC中,可以将两个构造函数合并为一个,使用默认参数来实现多态性。例如,可以将BC的构造函数改写为:`BC(int a1, int a2 = -1) { x = a1; z = a2; }`,这样在创建对象时可以只传递一个参数,而第二个参数则默认为-1。
- 在类DC中,可以添加一个默认构造函数,并在其中调用其基类BC的默认构造函数来进行初始化。例如,可以将DC的构造函数改写为:`DC(int a) : BC() { y = a; }`,这样在创建对象时可以不传递参数,而调用BC的默认构造函数来进行初始化。
综上所述,改进后的程序如下所示:
```
class BC {
protected:
int x, z;
public:
BC() : x(0), z(-1) {}
BC(int a1, int a2 = -1) : x(a1), z(a2) {}
};
class DC : public BC {
private:
int y;
public:
DC() : BC(), y(0) {}
DC(int a) : BC(), y(a) {}
};
```
在这个改进后的程序中,类BC添加了一个默认构造函数,并将成员变量x和z声明为protected访问级别;同时将两个构造函数合并为一个,并使用默认参数来实现多态性。类DC也添加了一个默认构造函数,并在其中调用其基类BC的默认构造函数来进行初始化。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)