本节书摘来自异步社区出版社《c++多线程编程实战》一书中的第1章,第1.6节,作者: 【黑山共和国】milos ljumovic(米洛斯 留莫维奇),更多章节内容可以访问云栖社区“异步社区”公众号查看。
继承是oop中非常重要的特性。继承至少关系到两个类(或更多类):如果b类是某一种a类,那么b类的对象就拥有与a类对象相同的属性。除此之外,b类也可以实现新的方法和属性,以代替a类相应的方法和属性。
准备就绪
确定安装并运行了visual studio。
操作步骤
现在,执行以下步骤来修改前面的示例。
1.创建一个默认控制台应用程序,命名为<code>inheritancetest</code>。
2.打开<code>inheritancetest.cpp</code>文件,输入下面的代码:
cworker( int iage, char sname, char semploymentstatus )
: cperson( iage, sname )
{
strcpy_s( this->semploymentstatus, 32, semploymentstatus );
}<code>`</code>
注意看<code>cworker</code>构造函数的原型,其形参列表后面有一个:(冒号),后面调用的是基类的构造函数,如下代码所示。在创建<code>cperson</code>时,需要两个参数<code>iage</code>和<code>sname</code>:
<code>cperson(iage, sname)</code>
调用析构函数的顺序要反过来,即先调用派生类的析构函数,后调用基类的析构函数。
一图胜千言,<code>cperson</code>、<code>cworker</code>和<code>cstuden</code>t类对象分别如图1.2所示。

图1.2 cperson、cworker和cstudent类对象
可以针对用户自定义的类型来定义运算符的含义,如前面例子中的<code>ccomplex</code>。这样做非常好,当<code>c</code>、<code>c1</code>和<code>c2</code>是复数时,<code>c = c1 + c2比c = complexadd(c1, c2)</code>更直观更容易理解。
要让编译器能处理用户自定义的类型,就必须实现运算符函数或重载相应的函数。假设,有两个矩阵<code>m1</code>、<code>m2</code>和一个矩阵表达式<code>m = m1 + m2</code>。编译器知道如何处理基本类型(如,把两个整数相加),但如果事先没有定义<code>cmatrix operator+(const cmatrix& m1, const cmtrix& m2)</code>函数,编译器就不知道如何计算矩阵加法。
覆盖(override)方法也是一种特性,允许派生类在基类已经实现某方法的前提下提供自己的特定实现。如前面例子中的<code>whoami</code>方法所示,其输出如下: