关于继承的成员的问题

tianshilei1992 2012-04-07 11:29:41
子类不能直接使用父类的成员吗?比如初始化成员变量?

class Student
{
public:
Student() : name("Student"), sex('M'), age(18), num("1") {}
Student(string n, char s, int a, string no) : name(n), sex(s), age(a), num(no) {}
protected:
int age;
string name;
char sex;
string num;
};

class CollegeStudent : public Student
{
public:
CollegeStudent(string n, char s, int a, string no) : name("CollegeStudent") {}
};


编译器在子类那name那里提示错误,说是“name不是类CollegeStudent的非静态数据成员或基类”,这是咋回事?
我的理解是,子类继承了基类的非protected变量,作为自己的成员变量来用,可以这样不?
...全文
120 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fergon 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

子类不可以直接访问基类的数据成员,如果实在想要访问,只能通过调用基类的成员函数实现
[/Quote]
....
谁说不可以?赋值也算是访问吧?

class CollegeStudent : public Student
{
public:
CollegeStudent(string n, char s, int a, string no) {name="CollegeStudent";}
};

Fergon 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
引用 3 楼 的回复:

子类不可以直接访问基类的数据成员,如果实在想要访问,只能通过调用基类的成员函数实现

....
谁说不可以?赋值也算是访问吧?

class CollegeStudent : public Student
{
public:
CollegeStudent(string n, char s, int a, string no……
[/Quote]
我只是纠正3楼的话,使用“访问”这样的解释是不对路的。基类的protected数据成员,在派生类中当然是可见的,也就是可直接访问的。我提出初始化和赋值,也只是让人思考两者的不同而已,这也是理解构造函数显式初始化容易糊涂的地方。如果明白构造函数调用次序、成员初始化的时机,哪么答案就不言而喻了。

从面向对象的角度来看,也许真的是越俎代庖,但是从低层构造的角度来看,这是很合理的,因为成员初始化总是发生在构造函数调用之前。


LLionTree 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

子类不可以直接访问基类的数据成员,如果实在想要访问,只能通过调用基类的成员函数实现

....
谁说不可以?赋值也算是访问吧?

class CollegeStudent : public Student
{
public:
CollegeStudent(string n, char s, int a, string no) {name="Coll……
[/Quote]
一:区别 赋值(assignment)和初始化(initialize)的概念。
二:基类的成员的初始化由基类的构造函数来完成,在成员初始化列表(member initialization list)中应该使用基类的构造函数来完成。

在这里初始化完成在先,因为你基类已经有default constructor,所以会首先将调用基类default constructor进行初始化,接下来你将name的值指定为CollegeStudent,这是由于其access level 是protected,对子类可见。
qscool1987 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

子类不可以直接访问基类的数据成员,如果实在想要访问,只能通过调用基类的成员函数实现

....
谁说不可以?赋值也算是访问吧?

class CollegeStudent : public Student
{
public:
CollegeStudent(string n, char s, int a, string no) {name="Coll……
[/Quote]
这个是规定,标准上叫subobject,在初始化列表中只能通过基类的构造函数来初始化,你不能显示的初始化基类的数据成员,尽管可见但是这是越俎代庖
LJYliang 2012-04-07
  • 打赏
  • 举报
回复
子类不可以直接访问基类的数据成员,如果实在想要访问,只能通过调用基类的成员函数实现
Jim_King_2000 2012-04-07
  • 打赏
  • 举报
回复
貌似初始化列表只能初始化自己的成员或者父类,对于父类成员则不行。
evencoming 2012-04-07
  • 打赏
  • 举报
回复
不行.
对于类CollegeStudent构造时你这样的写法相当于
先调用父类构造函数
Student();
然后调用
CollegeStudent(string n, char s, int a, string no);
如果要达到你那样的要求,需要
CollegeStudent(string n, char s, int a, string no):Student("CollegeStudent",....){}

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧