VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: fei0105

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

[复制链接]

1

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-12 21:45:01 | 显示全部楼层
julines 你的意思我明白了,那继承来的私有属性,就只是为了能够把子类对象当父类对象用时保证成员完整么,不能其他用法了? 在子类的成员函数里 调用自己的继承来的name行么
cout<<"Teacher construct: "<<name<<" in "------这里面的name可不可以是子类自己的(继承来的)
       <<school<<endl;
你说 name属性是teacher和people都拥有的属性,不能说是谁就是谁的了。
还是有点模糊 子类实例化时,不是还是要有自己的name属性么
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-13 08:15:01 | 显示全部楼层
就调用自己的好了  不必用父类里的
================================
楼主是不是想说,既然子类中已经有这个在父类中定义的成员,那就让我子类访问好了,还搞什么私有继承不能访问父类中定义的私有成员,神神秘秘?
那我问你:你为什么要私有继承呢?你知道私有继承意味着什么吗?你既然想在子类中访问父类中的定义的私有成员,为什么不用公有继承呢?

公有继承是is-a的关系,每个子类对象都是一个父类对象.对父类对象的所有操作都适合子类对象.
private继承意味着implemented-in-terms-of(根据某物实现出).
如果你让class D以private形式继承class B,你的用意是为了采用
class B内已经备妥的某些特性(或者说D对象根据B对象实现而得),而不是因
为B对象和D对象存在有任何概念上的关系.
既然如此,根据封装的思想,当然不应该让你访问一个在父类中定义的私有成员.
private继承意味只有实现部分被继承,需要对外公布任何接口都要重新"转交".  
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-7-13 10:30:02 | 显示全部楼层
子类的实例化需要name属性,实际上这个值是去给基类的构造函数用的。
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-7-13 11:15:01 | 显示全部楼层
说白了,在子类的对象中,父类依然是一个逻辑和物理上的整体。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-13 14:00:02 | 显示全部楼层
如果是私有的父类成员,那么子类是不可能继承的吧。
要调用成员有几种办法,通过对象,通过类名,通过友员。
你想想既然直接是使用那不肯定是子类本书的成员了对吧。
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-14 00:30:01 | 显示全部楼层
看了楼上这么多回答,我也有了和楼主同样的疑惑:

既然用了public继承父类,此时子类就继承了父类所有的成员(包括private,public,protected),但不能访问从父类继承而来的private成员(因为它是父类私有的)
,若非要访问可以通过Set,Get存取函数来间接访问.

也就是说,子类虽然有这个从父类继承而来的private成员,但是不能直截用!!(-_-b不知道理解的对不对)

我现在的问题是:在子类构造函数中给父类成员赋初值算什么?
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-14 07:00:02 | 显示全部楼层
子类继承父类的属性但不能使用,是从安全方面考虑的。
因为父类和子类的作者非常可能不是同一个人。子类的作者可能对父类的私有属性不熟悉,如果对其操作,很可能会产生危险,但是子类可以通过调用父类封装好的方法(如get,set)对私有属性进行操作。要知道封装是面向对象的成名属性之一。
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-14 09:45:01 | 显示全部楼层
晕,没有说明白我上面说的问题
在子类构造函数中给父类成员赋初值时不就是访问了父类的私有成员了吗?
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-14 15:00:01 | 显示全部楼层
//假设有类Base和Drived如下:
class Base
{
private:
    char name[10];  
};
class Drived:public Base
{
    //不论是public继承还是private继承,Drived对象的内存布局
    //都与下面的Drived_likeness一样,所不同的是可访问性和对name的操作.
    //因为这里的name来自Base,如果name在Base中被声明为private的,
    //那么,虽然Drived对象中有name的位置,但不能直接访问.所有对name的
    //操作都要依靠基类的非私有函数.
    //如果name在Base中被声明为protected的或public的,本类的函数就可以
    //访问了.  如果是private继承,name的可访问性就变为private的,public继承则
    //name可访问性不变(但若name在基类中就是private的,则不可访问).
    //错误观点1:如果是私有的父类成员,那么子类是不可能继承的吧。
    //这个话好象是在说Drived中就没有name的位置,所以错.
    //错误观点2:子类继承后相当于一个引用一样,调用的时候还是用到父类的定义
    //怎么扯到引用上去了呢
    //再强调一启遍:子类对象也是一个整体,包括从父类继承部分(如本例中的name)
    //和自己新增部分(如本例中的age)
private:
    int age;
};
class Drived_likeness
{
private:
    char name[10];
    int age;
};
回复

使用道具 举报

1

主题

13

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-14 20:00:01 | 显示全部楼层
在子类构造函数中给父类成员赋初值时不就是访问了父类的私有成员了吗?
回复

使用道具 举报

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

本版积分规则

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

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