C++类继承

派生类的初始化:

派生类的构造函数必须调用基类的构造函数来初始化基类数据成员。因此,创建派生类对象时,程序首先创建基类对象,也就是说:基类对象必须在程序进入派生类构造函数之前被创建,因此,C++在成员初始化列表中来调用基类构造函数初始化基类数据成员。

注意:有关派生类构造函数必须注意一下三点;

a)首先创建基类对象;

b)派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数;

c)派生类构造函数可以初始化派生类新增的数据成员。

派生类与基类之间的关系(is-a)

a)派生类可以使用基类的方法,条件是方法不能为基类私有

b)基类指针可以在不进行显式类型转换的情况下指向派生类对象

c)基类引用可以在不进行显式类型转换的情况下引用派生类对象

注意:基类指针和引用只能调用基类方法,不能调用派生类方法。派生类对象和地址可以赋给基类引用和指针,但不能将基类对象和地址赋给派生类引用和指针。


多态公有继承:

两种重要机制实行多态:

a)派生类中重新定义基类的方法(静态联编

b)在基类中将需要在派生类中重新定义的方法声明为virtual(动态联编);

注意:a)基类必须定义析构函数,且析构函数必须声明为virtual,这是为了动态联编时自动调用派生类对象的析构函数对派生类对象进行释放。派生类对象过期时,也应该先执行派生类对象的析构函数,然后执行基类对象的析构函数。

动态联编的好处:

通过基类的引用或指针调用派生类中的函数。之所以叫动态联编,是因为在程序运行中决定到底使用哪一个函数,也就是由指针或引用所指向的对象类型来决定的,而不是像静态联编那样,是根据指针或引用类型在编译时期决定调用哪一个函数的。

派生类重载基类成员函数:(注意重载的概念啊)

派生类重载基类成员函数将导致基类成员函数被隐藏,即无法通过派生类对象访问被隐藏的基类成员函数,除非重新定义所有的基类版本。但是,如果基类成员函数返回类型是基类引用或指针,则可以在派生类中重载该成员函数的返回类型为派生类对象的引用或指0针,就不会引起隐藏基类成员函数(类型协变)。

公有派生:

基类的公有成员将成为派生类的公有成员;基类的私有部分也将成为派生类的私有部分,但是,该部分只能通过基类的公有和保护方法访问。因此,派生类对象将存储基类的数据成员,派生类对象只能使用基类中的公有方法

在包含new分配的动态内存指针成员变量时,必须对基类和派生类的“析构函数”“复制构造函数”“复制运算符函数”格外注意:

a)基类成员变量包含动态分配内存的指针,派生类新添加new动态分配内存的指针成员变量:

派生类的析构函数、复制构造函数、赋值运算符都必须使用基类的响应方法来处理继承的基类成员。对于析构函数,由系统自动调用完成;对于构造函数,通过在派生类构造函数初始化列表中调用基类构造函数,否则自动调用基类默认构造函数;对于赋值运算符,派生类使用作用域限定符显式调用基类赋值运算符完成。

b)基类成员变量包含动态分配内存的指针,派生类不添加new动态分配内存的指针成员变量:

派生类的析构函数,赋值运算符,复制构造函数都可以使用默认函数。原因很简单,自己想(派生类对象中的基类部分将自动调用基类的复制运算符和复制构造函数)

派生类对象可以赋值给基类对象吗?

要正确解答这个问题,一定要意识到在C++中,对象之间的拷贝都是通过调用赋值运算符左边对象的赋值运算符函数来实现的。基类对象的赋值运算符参数都尽可能声明为基类引用类型,因此在将派生类对象赋值给基类对象时可以将派生类对象传递给基类引用变量,因此可以将派生类对象赋值给基类对象。反之,一般不能够将基类对象赋值给派生类对象,原因同上。但是,如过在派生类对象中定义了将基类对象赋值给派生类对象的赋值构造函数或者赋值运算符时,就可以了。

基类的析构函数被声明为纯虚析构函数

纯虚析构函数和普通纯虚函数的区别在于,纯虚析构函数需要提供函数的实现,而一般纯虚函数不能有实现,这样的原因在于,纯虚析构函数最终需要被调用,以析构基类对象,虽然是抽象类没有实体。而如果不提供该析构函数的实现,将使得在析构过程中,析构无法完成而导致析构异常的问题。因为析构函数不会被继承,所以不需担心派生类继承了基类析构函数而未实现该析构函数而为抽象类。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值