第十三章:类继承

来源:互联网 发布:录屏软件哪个好 编辑:程序博客网 时间:2024/05/16 18:07

构造函数使用初始化列表的好处

  1. 构造函数使用初始化列表初始化类对象数据成员:直接调用类对象的复制构造函数。
  2. 不用初始化列表是先调用默认构造函数,再调用赋值运算符重载函数。

string类有一个将const char *作为参数的构造函数。
“hello”字符串返回的是char *
string类对象接收char ,调用将const char 作为参数的构造函数
string类对象接收string,调用将const string &作为参数的构造函数

派生类的构造函数和特性:

  1. 派生类的构造函数必须给新成员和继承的成员提供数据。
  2. 派生类的构造函数总是调用基类的构造函数
  3. 创建派生类对象前程序首先创建基类对象—通过初始化列表的方法来实现。
  4. 如果不显式的使用初始化列表,程序将调用基类默认的构造函数。
  5. 如果调用了基类的复制构造函数,而基类没有定义复制构造函数,编译器将自动生成一个,进行数据的浅拷贝。
  6. 如果基类的数据成员没有使用new创建,则调用默认的复制构造函数没问题。

派生类的构造函数要点:

  1. 首先创建基类对象
  2. 派生类的构造函数应通过使用初始化列表将基类信息传递给基类构造函数。
  3. 初始化派生类新增的数据成员。

首先执行派生类的析构函数,然后执行基类的析构函数。

成员初始化列表只能用于构造函数。

基类和派生类的关系:

  1. 派生类可以调用基类的非私有的基类的方法。
  2. 基类引用可以引用派生类对象 不进行显式类型转换
  3. 基类指针可以指向派生类对象 不进行显式类型转换

公有继承表示is-a的关系

多态

方法的行为取决于调用该方法的对象

公有继承实现多态:

  1. 在派生类中重新定义基类的方法
  2. 使用虚方法
    • 在基类中将派生类会重新定义的方法声明为虚方法。这样在派生类中该方法自动成为虚方法。
    • 在派生类中将自动成为虚方法的方法添加virtual更好。
虚方法的功能
程序将根据引用的对象或指针指向的对象的类型选择方法。

为基类声明一个虚析构函数,这样析构函数的调用也根据实际对象的类型。

virtual只用于方法的声明,不用于方法的定义中。

数组元素的类型必须相同。
使用指针数组存放指向基类和派生类对象的指针,就是多态性

调用派生类的析构函数之后,会自动调用基类的析构函数。

静态联编
在编译过程中确定调用哪个函数
动态联编
在运行过程中确定调用哪个函数

使用虚函数来实现动态联编

默认是静态联编:效率更高,动态联编可能用不到。

C++的指导原则:不要为不使用的特性付出代价。

虚函数注意事项:

  1. 派生类不继承基类的构造函数,构造函数也不能是虚函数。
  2. 基类的析构函数应该是虚函数。
    • 不做基类的类的析构函数添加了virtual并不错,只是效率不高。
  3. 友元函数不能是虚函数,因为友元函数不是类方法。
  4. 如果没有重新定义虚函数,调用最新的基类版本。
  5. 重新定义基类函数不是重载基类函数。参数列表必须和基类的相同,但是允许返回类型随着类类型的改变而改变。
    即如果是基类的引用或指针,可以改为派生类的引用或指针。

对于外部世界来说:保护成员的行为和私有成员相似,
对于派生类来说:保护成员的行为和公有成员相似。

最好对于类数据成员采用私有访问控制,然后通过基类方法使派生类能访问基类数据。

静态数据成员和成员函数会被继承。
友元函数和静态成员函数和构造函数不能声明为虚函数。
不能被继承的函数:
构造函数,友元函数,析构函数, 复制构造函数,赋值函数。

ABC抽象基类

纯虚函数相关:

  1. C++中提供未实现的函数—纯虚函数。可以不定义,定义也没有影响。但是其他非纯虚函数一定要定义。
    virtul double Area()const = 0;
    virtul double Area() = 0;
  2. 当类声明中包含纯虚函数时,则不能创建该类的对象。
  3. 包含纯虚函数的类只用作基类。

纯虚函数被继承之后,对于派生类而言就是虚函数的地位。

基类使用new:

  1. 派生类没有使用new 派生类可以不定义析构函数,复制构造函数,重载赋值运算法
  2. 派生类使用new 派生类必须定义析构函数(自动调用基类析构函数),复制构造函数(初始化列表),重载赋值运算法
    baseClassName::operator=(派生类对象)

Q: 对于输出运算符<<,基类重载设置为友元函数,派生类也重载设置为友元函数。在派生类中如何知道要调用父类的友元函数呢?该友元函数并没有继承?
A: 其实友元函数不需要继承就可以使用,只是为了指出不是调用自己的重载<<函数,需要将派生类对象强制转换为基类的引用类型,这样就会直接调用基类的友元重载<<运算符函数了。

什么情况下会调用复制构造函数?

  1. 将新对象初始化一个同类对象
  2. 按值将对象传递给一个函数
  3. 函数按值返回对象
  4. 编译器生成临时对象

析构函数为什么要设置成虚函数?

当释放指向对象的指针或引用来删除派生类对象时,会先调用派生类的析构,再调用基类的析构

阅读全文
0 0
原创粉丝点击