继承易错点分析
【摘要】 1)基类private(私有)成员在派生类中无论以什么方式继承都是不可见的。什么叫’不可见’ ->继承了但是在子类不能用这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。从内存上: 子类对象拥有这个成员 语法上:规定了我们不能去访问,但是我们可以通过父类的函数去访问!//基类class Person{private: ...
1)基类private(私有)成员在派生类中无论以什么方式继承都是不可见的。
什么叫’不可见’ ->继承了但是在子类不能用
- 这里的不可见是指基类的私有成员还是被继承到了派生类对象中,
- 但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
- 从内存上: 子类对象拥有这个成员 语法上:规定了我们不能去访问,但是我们可以通过父类的函数去访问!
//基类
class Person
{
private:
string _name = "张三";//这里不是初始化,这里是给缺省值
};
//派生类
class Student :public Person
{
public:
void Print()
{
//在派生类当中访问基类的private成员,报错!!!
cout << _name << endl;
}
protected:
int _stdid;//学生学号
};
2)基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能 访问,就定义为protected。
- 可以看出保护成员限定符是因继承才出现的。
基类中,如果想给别人访问,就定义成公有, 不想别人访问就定义成保护,父类保护的成员被继承了,在子类中能使用,但是父类私有的成员被继承下来,在子类中不能使用
在基类中,保护和私有是一样的,都是对外不能访问,但是在子类中的意义不一样
但是我们可以在子类通过基类的成员函数访问基类的私有成员
//基类
class Person
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;//通过调用基类的成员函数,在派生类中访问基类的私有成员
}
protected:
string _name = "zhangsan";
private:
int _age = 19;//私有成员
};
class Student : public Person
{
private:
int _stuid;
};
int main()
{
Student s;
s.Print();
return 0;
}
3)在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用 protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中 扩展维护性不强。
4)使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的 写出继承方式。
//基类
class Person
{
public:
string _name;
};
//派生类
class Student : Person //class默认的继承方式是private
{
protected:
int _stuid;
};
继承下来的 基类成员_name的访问方式变为private。
//基类
class Person
{
public:
string _name;
};
//派生类
struct Student : Person //struct默认的继承方式是public
{
protected:
int _stuid;
};
继承下来的基类成员_name的访问方式为public
常见的使用:
父类成员:公有private
和保护protected
子类继承方式:公有继承public
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)