C++中的继承

1.1 继承的概念

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有的特性基础上进行扩展,增加功能,这样产生新的类,称作是派生类。继承呈现了面向对象程序设计的层析结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。

例如:
class Person
{
public:
void Print(){
cout<<“name:”<<_name<<endl;
cout<<“age:”<<_age<<endl;
}
protected:
string _name = “Romeo”; //姓名
int _age = 18; //年龄
};
/继承后父类的Person的成员(成员函数+变量)都会变成子类的一部分。这里
体现出了Student和Teacher复用了Person的成员。
/
class Student: public Person
{
protected:
int _stuid; //学号
};

class Teacher:public Person
{
protected:
int _jobid; //工号
};
1.2 继承的定义
class Student:public Person
{
public:
int _stuid; //学号
char _major; //专业
};
Student称为 派生类;
第一行的public是继承方式;
Person称为基类。

以下是三种继承方式:
在这里插入图片描述

以下是继承基类成员访问方式的变化:
在这里插入图片描述
总结:

1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2.基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接访问,但需要在派生类中能访问,就定义为protected。可见,保护成员限定符protected是因为继承才出现的。
3.表格里的访问方式都是取最小的“权限”。
4.使用关键字class时默认的继承方式是private,使用struct的默认继承方式是public,不过最好显示地写出继承方式。
5.**在实际运用中一般都使用的是public继承,几乎很少去使用protected/private继承,**也不提倡去使用。因为protected/private继承下来的成员都只能在派生类的类里面使用,实际中的扩展维护性不强。
2.基类和派生类对象赋值转换
a. 派生类对象可以赋值给基类对象/基类的指针/基类的引用。这里有个形象的说法叫“切片”或者“切割”。寓意把派生类中父类那部分切来赋值过去。
b. 基类对象不能赋值给派生类对象。
c. 基类的指针可以通过强制类型转换赋值给派生类指针。但是必须是基类的指针指向派生类对象时才是安全的。 这里的基类如果是多态类型,可以使用dynamic _cast来进行识别后进行安全转换。如下图所示:
在这里插入图片描述
示例代码:
class Person
{
protected:
string _name; //姓名
string _sex; //性别
int _age; //年龄
};

class Student:public Person
{
public:
int _No; //学号
};

void Test()
{
Student sobj;
//1.子类对象可以赋值给父类对象/指针/引用
Person pobj = sobj;
Person* pp = &sobj;
Person& rp = sobj;
//2.基类对象不能赋值给派生类对象
sboj = pobj; //error
//3.基类的指针可以通过强制类型转换赋值给派生类指针
pp = &sobj;
Student* ps1 = (Student*)pp;
ps1->_No = 10;

pp = &pobj;
Student* ps2 = (Student*)pp; //这种情况虽然可以,但会发生访问越界。
ps2->_No = 10;

}

int main()
{
Test();
return 0;
}
3.继承中的作用域
(1) 在继承体系中基类和派生类都有独立的作用域。
(2) 子类和父类中有同名成员,子类成员将屏蔽父****类对同名成员的直接访问,这种情况叫“隐藏”,也叫“重定义”(在子类成员函数中,可以使用 基类::基类成员 显示访问 )
(3) 需要注意的是如果成员函数的隐藏,只需要函数名相同就构成了隐藏。
(4) 注意:在实际工程中,继承体系里最好不要定义同名成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值