文章目录
0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
本文档为个人边学习边记录的C++笔记,非教程,笔记中会存在引用他人文章内容的部分,被引用的原文不会被特殊标记出来,但会在参考文档中给出原文链接。
0x01 类型兼容规则
类型兼容规则就是指在需要基类对象的任何地方,都可以使用共有派生类的对象来替代 。
凡是基类能够解决的问题,共有派生类都可以解决。
类型兼容规则中所指的替代包括以下情况:
·派生类的对象可以隐含转换为基类对象。
·派生类的对象可以初始化基类的引用。
·派生类的指针可以隐含转换为基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
在如下程序中,b1为B类对象,d1为D类对象:
class B {...}
class D:public B {...}
B b1, *pb1;
D d1;
这时:
(1)派生类对象可以隐含转换为基类对象,即用派生类对象中从基类继承来的成员,诸葛赋值给基类对象的成员;
(2)派生类对象也可以初始化基类对象的引用:
(3)派生类对象的地址也可以隐含转换为指向基类的指针:
由于类型兼容规则的引入,对于基类及其公有派生类的对象,可以使用相同的函数统一进行处理。因为当函数形参为基类的对象(或引用、指针)时,实参可以是派生类的对象(或指针),而没有必要为每一个类设计单独的模块,大大提高了程序的效率。
例:类型兼容规则实例:
#include<iostream>
using namespace std;
class Base1{
public:
void display() const {cout << "Base1::display()" << endl;}
};
class Base2: public Base1{
public:
void display() const {cout << "Base2::display()" << endl;}
};
class Derived: public Base2{
public:
void display() const {cout << "Derived::display()" << endl;}
};
void fun(Base1 *ptr){
ptr->display();
}
int main(){
Base1 base1;
Base2 base2;
Derived derived;
fun(&base1);
fun(&base2);
fun(&derived);
return 0;
}
运行结果:
Base1::display()
Base1::display()
Base1::display()
虽然根据类型兼容原则,可以将派生类对象的地址赋值给基类Base1的指针,但是通过这个基类类型的指针,却只能访问到从基类集成的成员。
《C++语言程序设计(第4版)》书上所有章节出现的示例源代码随着学习的深入会陆续上传至github,代码为个人手动输入并通过编译,有的示例代码可能没有注释:https://github.com/fyw4/C-plus-plus-learning-example
以上。
参考文档:
郑莉 董渊 何江舟.《C++语言程序设计(第4版)》[M].北京:清华大学出版社。