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; };的错误
时间: 2023-12-03 21:02:15 浏览: 34
这个程序存在一个错误,即在类DC的构造函数,没有调用其基类BC的构造函数来进行基类部分的初始化。在派生类的构造函数中,如果没有显式地调用基类的构造函数,则编译器会自动调用基类的默认构造函数。但是,在类BC中并没有定义默认构造函数,因此在类DC的构造函数中必须显式地调用其基类BC的某个构造函数来进行基类部分的初始化。
修复这个程序的方法是,在类DC的构造函数中,通过初始化列表调用其基类BC的某个构造函数来进行基类部分的初始化。例如:
```
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) : BC(a) { y = a; }
private:
int y;
};
```
在这个修改后的代码中,类DC的构造函数通过初始化列表调用其基类BC的构造函数BC(a)来进行基类部分的初始化。这样,在创建类DC的对象时,先调用其基类BC的构造函数进行基类部分的初始化,然后再执行类DC的构造函数中的语句进行派生类部分的初始化。
相关问题
class C public: C(inta){x=a; private: int x; }; class D: public C { public: D (int a): y(a) { } private: int y; };指出问题,说明原因
这段代码存在两个问题:
1. 缺少访问修饰符。
在类C中,缺少访问修饰符,导致类中的成员变量和成员函数默认为私有的。因此,在类定义中应添加公共访问修饰符“public:”,以便在类外部访问类中的成员。
2. 子类构造函数没有初始化基类。
在类D中,构造函数没有初始化基类C的成员变量x。因此,在类D的构造函数中应该调用基类C的构造函数来初始化基类成员变量。可以通过以下方式来实现:D(int a): C(a), y(a) {}
修正后的代码如下所示:
```
class C {
public:
C(int a) {
x = a;
}
public:
int x;
};
class D : public C {
public:
D(int a) : C(a), y(a) {
}
private:
int y;
};
```
在修正后的代码中,类C的成员变量x设置为公共的,类D的构造函数中通过调用基类C的构造函数来初始化基类成员变量x,并且初始化自身的成员变量y。
#include<iostream> using namespace std; class B{int a; public:B(int sa){a=sa;}}; class B1:virtual public B{int b; public:B1(int sa,int sb):B(sa){b=sb;}}; class B2:virtual public B{int c; public:B2(int sa,int sc):B(sa){c=sc;}}; class D:public B1,public B2{int d; public:D(int sa,int sb,int sc,int sd):B(sa),B1(sb),B2(sc) {d=sd;}};修改一下这段代码
这段代码本身没有问题,但是如果您需要修改的话,可以根据您的需求进行修改,以下是一些可行的修改方案:
1. 在类 B 中添加一个默认构造函数,以避免编译错误:
```
class B{
int a;
public:
B() {}
B(int sa) { a=sa; }
};
```
2. 在类 B1 和 B2 的构造函数中,调用基类 B 的构造函数时,应该使用虚基类语法:
```
class B1: virtual public B {
int b;
public:
B1(int sa, int sb): B(sa) { b=sb; }
};
class B2: virtual public B {
int c;
public:
B2(int sa, int sc): B(sa) { c=sc; }
};
```
3. 在类 D 的构造函数中,应该按照基类的初始化顺序,先初始化 B1 和 B2,再初始化 D:
```
class D: public B1, public B2 {
int d;
public:
D(int sa, int sb, int sc, int sd): B(sa), B1(sa, sb), B2(sa, sc) { d=sd; }
};
```
这些修改可以使代码更加规范和易于理解。