面向对象之继承

1. 继承的特性

  • 子类(派生类)会继承父类(基类)的所有数据成员但访问受限,根据继承方式的不同,受限情况也不同

2 继承方式

此段摘自 http://blog.csdn.net/chengonghao/article/details/51062226
继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选的,如果不写,默认为 private 或 protected。

不要将继承方式成员属性搞混了,不同的继承方式会赋予继承来的成员不同的属性

简单说一下public、private和protect这三种属性:
public:公有属性,能够被本类成员函数、友员函数和派生类成员函数访问,也能被对象所在的函数访问(4个权限)
protect:保护属性,能够被本类成员、友员和派生类访问,但不能被对象所在的函数访问(3个权限)
private:私有属性,只能被本类成员和友员访问(2个权限)

1) public继承方式

  • 基类中所有public成员在派生类中为public属性;
  • 基类中所有protected成员在派生类中为protected属性;
  • 基类中所有private成员在派生类中不可访问。

2) protected继承方式

  • 基类中的所有public成员在派生类中为protected属性;
  • 基类中的所有protected成员在派生类中为protected属性;
  • 基类中的所有private成员在派生类中仍然不可访问。

3) private继承方式

  • 基类中的所有public成员在派生类中均为private属性;
  • 基类中的所有protected成员在派生类中均为private属性;
  • 基类中的所有private成员在派生类中均不可访问。

由此可见:

  • 基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。
  • 基类中的 private 成员在派生类中始终是不可访问的。

private 继承限制太多,实际开发中很少使用,一般使用 public。

3. 继承类(子类)再对象实例化时基类和子类的构造和析构过程

基类构造 -> 派生类构造 -> 派生类析构 -> 基类析构

4. 隐藏

隐藏是在基类和派生类有同名成员时产生的概念,当成员同名时,该名字代表的是派生类的成员,要访问基类成员,必须添加基类的域。

  • 代码演示,类定义
//父类,拥有成员函数Play()和成员变量Salary
class People
{
public:
    int  Salary;
    void Play() {};
};
//子类,也拥有成员函数Play()成员变量Salary
class Worker:public People
{
public:
    int  Salary;
    void Play() {};
};
  • 代码演示,调用
int main()
{
    int v1,v2;
    Worker wor;                    //实例化继承了People的Worker类
    v1 = wor.Sallary;            //将Worker的成员变量Sallary赋给v1
    v2 = wor.People::Sallary;    //将父类People的成员变量Sallary赋给v2
    wor.Play()                    //调用Worker类的Play函数
    wor.People::Play()            //调用People类的Play函数
    return 0;
}

虽然C++中允许父类和子类拥有同名成员,但在实际编码运用中我们应该尽量不要使用同名成员,以免造成不必要的麻烦。成员变量规范命名是完全可以避免出现这种情况的

5. 基类和派生类对象的赋值运算

因为派生类会完全继承基类的数据成员,所以可以把基类对象作为左值,派生类对象作为右值进行赋值运算(反之不可以)。赋值过程调用基类的拷贝构造函数。

  • 代码演示
int main()
{
    People peo;        //基类对象peo
    Worker wor;        //派生类对象wor
    peo = wor;        //peo做左值,wor做右值是可以的
    //wor = peo        //wor做左值,peo做右值是不允许的
    return 0;
}

6. 基类和派生类对象的指针指向问题

与赋值运算相似,基类的指针也可以指向派生类实现基类的一些功能。
需要指出的是:如果用基类指针接收动态内存申请的派生类对象时要把基类中的析构函数定义为虚析构函数,否则派生类的析构函数在执行delete时将不会执行。

7. 多继承和多重继承

顾名思义,多继承就是一个派生类有多个基类,多重继承就是一个派生类的基类还有其基类。

除了类之外,结构体也是可以以继承的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值