class C public: C(inta){x=a; private: int x; }; class D: public C { public: D (int a): y(a) { } private: int y; };指出问题,说明原因
时间: 2024-03-22 20:42:24 浏览: 18
这段代码存在两个问题:
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。
相关问题
class C { public: C(int a) { x = a; } private: int x; }; class D :public C { public: D(int a) :y(a){} private: int y; };指出错误并说明原因
在类D的构造函数中,应该显式地调用其基类C的构造函数来初始化从C继承的成员变量x。否则,编译器会默认调用基类C的默认构造函数来初始化x,但是在C中并没有默认构造函数,因此编译会失败。正确的代码应该是:
```
class C {
public:
C(int a) { x = a; }
private:
int x;
};
class D : public C {
public:
D(int a) : C(a), y(a) {}
private:
int y;
};
```
这里在D的构造函数中显式地调用了C的构造函数来初始化x,同时也初始化了y。
#include<iostream> using namespace std; class C { public: C(int a) { x = a; } private: int x; }; class D :public C { public: D(int a) :y(a) {} private: int y; };错误详解
这段代码定义了两个类C和D,其中类D继承自类C。但是在类D的构造函数中,没有调用类C的构造函数进行初始化,这是不合法的。当类C没有默认构造函数时,子类D必须在构造函数中显式地调用类C的构造函数进行初始化。因此,需要在类D的构造函数初始化列表中调用类C的构造函数,如下所示:
```
class C {
public:
C(int a) { x = a; }
private:
int x;
};
class D : public C {
public:
D(int a) : C(a), y(a) {}
private:
int y;
};
```
这样就可以实现子类D对父类C的正确继承和初始化了。