type
date
status
slug
summary
tags
category
icon
password
网址

4.讨论公有继承:“是一个 ”

派生类与基类:
赋值兼容规则 C++面向对象编程中一条重要的规则是:公有继承意味着 "是一个" 。一定要牢牢记住这条规则。
在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括 以下情况:
  1. 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的隐藏对象赋值 给基类对象。反过来不行,因为派生类的新成员无值可赋。
  1. 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类 继承来的隐藏对象,不能访问派生类中的新成员。同样也不能反过来做。
  1. 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承 来的隐藏对象。
notion image
继承关系中的构成函数与析构函数
公有继承中派生类型对象构造和析构。
1.构造函数的基础
实现派生类的构造函数
面试:实现一个不能被继承的类型。final 容许派生类可以构造对象,而外部环境不可以构造对象。 总结: 构造函数的访问限定符为public , protected,private 的目的是什么?
继承关系中拷贝构造函数 1.程序设计者在基类和派生类中都没有定义拷贝构造函数;C++编译器将自动产生按位拷贝的拷贝构造函 数;在派生类的拷贝构造函数的初始化表中,加入基类拷贝构造函数的调用,是C++编译器合成的代 码;(完成行为的统一);// 0 0 2.程序设计者在基类中定义拷贝构造函数;而在派生类中没有定义拷贝构造函数;C++编译器将会在派 生类中自动产生按位拷贝的拷贝构造函数。并合成代码,调用(关联)基类的拷贝构造函数。 // 1 0 3.程序设计者在基类和派生类中都定义了拷贝构造函数;程序设计者在派生类中,没有指定调用基类的拷 贝构造函数时。C++编译器合成的代码调用基类的缺省构造函数,如果基类中没有缺省构造函数。合成 代码失败。编译错误。// 1 1 4 . 程序设计者在基类中没有定义拷贝构造函数(C++编译器将自动产生按位拷贝的拷贝构造函数)。而 在派生类中定义了拷贝构造函数。程序设计者在派生类中,没有指定调用基类的拷贝构造函数时。C++编 译器合成的代码调用基类的缺省构造函数,如果基类中没有缺省构造函数。 // 0 1 继承关系中赋值运算符的重载 1.程序设计者在基类和派生类中都没有重载operator=函数; C++编译器将在基类和派生类中自动产生按 位赋值的,重载operator=函数;C++编译器会在派生类的重载赋值函数中,加入基类重载赋值函数的调 用,是C++编译器合成的代码;(完成行为的统一);// 0 . 2.程序设计者在基类中定义重载赋值函数;而在派生类中没有定义重载赋值函数;C++编译器将会在派 生类中自动产生按位赋值的重载赋值函数。并合成代码,调用(关联)基类的重载赋值函数。 3,程序设计者在基类和派生类中都定义了重载赋值函数;程序设计者在派生类中,没有指定调用基类的 重载赋值函数时。C++编译器不会合成调用基类的重载赋值函数的代码。要在派生类的重载赋值函数调 用基类的重载赋值函数,程序设计者必须自己加入调用代码。 1 1 4.程序设计者在基类中没有定义重载赋值函数(C++编译器将自动产生按位赋值的重载赋值函数)。而 在派生类中定义了重载赋值函数。程序设计者在派生类中,没有指定调用基类的重载赋值函数。C++编译 器不会合成调用基类的重载赋值函数的代码。 完成:完成拷贝构造函数和赋值重载;
面试: final 最终的关键字 // nonInherit; 设计一个类型,不能在外部环境中创建该类的对象 设计一个不能被继承的类 ; 设计一个不能被继承的类 , 但可以在外部环境创建该类型的对象;
设计一个能被继承的类 , 但不能在外部环境创建该类型的对象; 面试:限制派生类对象不可以拷贝和赋值如何实现。 设计一个类型,不能在外部环境中创建该类的对象 :
设计一个不能被继承的类 ;
设计一个不能被继承的类 , 但可以在外部环境创建该类型的对象;
设计一个能被继承的类 , 但不能在外部环境创建该类型的对象;
面试:限制派生类对象不可以拷贝和赋值如何实现。