VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3814|回复: 25

一个关于派生类继承父类私有属性的问题 请教

[复制链接]

1

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-23 21:00:02 | 显示全部楼层 |阅读模式
父类
class People {
public:
   People(char *str);        //构造函数
   ~People();        //析构函数
protected:
   char *name;
};
#endif
父类实现:
{
People::People(char *str) {
   name = new char[strlen(str)+1];
   strcpy(name, str);
   cout<<"People construct: "<<name<<endl;
}
//析构函数的实现
People::~People() {
   cout<<"People destroy: "<<name<<endl;
   delete []name;
}People::People(char *str) {
   name = new char[strlen(str)+1];
   strcpy(name, str);
   cout<<"People construct: "<<name<<endl;
}
//析构函数的实现
People::~People() {
   cout<<"People destroy: "<<name<<endl;
   delete []name;
}

派生类:
class Teacher : public People {
public:
   Teacher(char *str, char *sch);        //构造函数
   ~Teacher();        //析构函数
protected:
   char *school;
};
派生实现
Teacher::Teacher(char *str, char *sch)
:People(str)        //调用基类的构造函数
{  school = new char[strlen(sch)+1];
   strcpy(school,sch);
   cout<<"Teacher construct: "<<name<<" in "------1
       <<school<<endl;
}
Teacher::~Teacher() {
   cout<<"Teacher destroy: "<<name<<" in "-----------2
       <<school<<endl;
   delete []school;  }


父类成员name必须为保护类型,才能在派生类的构造,析构函数中 1,2处 用到name。改为私有类型,子类中就无法访问。  但是子类继承时也有自己的name属性 继承过来,为什么不能调用, 1,2处调用的name是父类的还是子类的?
回复

使用道具 举报

0

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-4 06:15:01 | 显示全部楼层
private成员,只能由基类的成员和友员访问.
子类只能继承父类的public和protected成员,但是不会继承private成员.
回复

使用道具 举报

1

主题

27

帖子

23.00

积分

新手上路

Rank: 1

积分
23.00
发表于 2020-7-4 20:00:02 | 显示全部楼层
name应该是子类的吧
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-5 07:30:01 | 显示全部楼层
一楼说的对啊,private子类根本无法调用,初基类的成员函数可以调用,然后就只能用::的格式调用了
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-7-8 14:30:01 | 显示全部楼层
首先子类会继承父类的所有数据成员。公有继承以为着B是一个A,即teacher是一个people,所以name属性是teacher和people都拥有的属性,不能说是谁就是谁的了。

但是父类的private成员子类无权过问,“私有”的意义就在于独自占有。既然如此为什么还要继承private成员呢? C++的语义支持把一个子类转换成一个父类,如果子类丢失了父类的某个数据成员,怎么能成功转换呢?

回复

使用道具 举报

1

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-11 22:30:02 | 显示全部楼层
子类继承父类的所有成员 包括父类的 。书上讲的,应该确定了
楼上讲的意思
虽然子类里面有继承的父类的私有成员name  但是不能用,因为父类独自占有?即不能用自身继承来的属性,那继承来有什么作用呢〉?有点不明白
回复

使用道具 举报

1

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-11 23:15:01 | 显示全部楼层
上面朋友可能没明白我的意思
既然子类继承来了父类里的私有成员  就调用自己的好了  不必用父类里的 也就不用管父类里是私有或是保护什么类型的  这样行么?
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-7-12 06:15:02 | 显示全部楼层
呵呵,我已经说了:
既然如此为什么还要继承private成员呢? C++的语义支持把一个子类转换成一个父类,如果子类丢失了父类的某个数据成员,怎么能成功转换呢?
回复

使用道具 举报

1

主题

39

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-7-12 15:15:02 | 显示全部楼层

子类 继承 父类的 所有成员.
但是并不等于可以访问父类的所有成员.
private 这个属性限制的就不能访问.

不能访问不代表就没有作用, 比如类private 一些成员,将他隐藏了,难道这些隐藏的成员就
没有意义了么? 别人只需要访问公共接口,而公共接口能访问私有成员,这就足够了.


回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-12 18:45:01 | 显示全部楼层
上面朋友可能没明白我的意思
既然子类继承来了父类里的私有成员  就调用自己的好了  不必用父类里的 也就不用管父类里是私有或是保护什么类型的  这样行么?
========================================
觉得楼主好象没明白继承后的子类对象是个什么样子.
子类对象也是一个整体,包括从父类继承部分和自己新增部分.子类对象调用父类中定义的name并不是到另一个地方去找一个父类对象然后调用它的name,而是本身就有从父类继承来的name.只不过,如果name在父类中定义时是私有的,在私有继承的子类中虽然有这个name,但不能用常规的方法访问到.何来"就调用自己的好了  不必用父类里的"?  
如果子类对象需要访问父类里定义的成员,那么说明不应该使用私有继承或者不应该在父类中定义该成员为私有的.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表