⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 publicinheritance.html

📁 关于 C++ 的历史无须我来介绍了
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">
  <link rel="stylesheet" href="css/print.css" type="text/css">
  <meta content="text/html; charset=gb2312" http-equiv="content-type">
  <title>公开(public)继承</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">C++
Gossip:&nbsp;公开(public)继承</a></h1>
假设您先前已经撰写了一些2D绘图相关类别,现在打算将之扩充为适用于3D绘图,3D的观念是2D的延伸,许多2D绘图时所使用的功能都可以留下来加以扩
充,在C++中您不用重写所有的类别,您可以“继承”(Inherit)原先已定义好的类别,然后加以扩充。 <br>
<br>
例如绘图中最基本的点类别,您原先已定义好一个Point2D类别,您继承它并将之扩充为Point3D类别,在继承的关系中,称被继承的类别为“父类
别”(Parent class)或“基础类别”(Base class),而继承父类别的就称之为“子类别”(Child
class)或“衍生类别”(Derived class),在继承时您使用 <span style="font-weight: bold;">:</span>
运算子,并指定其继承方式,在继承的权限关系上,公开继承是最常见的,先由这个开始说明继承的概念。 <br>
<br>
直接使用一个实际例子来说明好了,先定义Point2D: <br>
<ul>
  <li>Point2D.h</li>
</ul>
<pre>class Point2D { <br>public: <br>    Point2D() {<br>        _x = 0;<br>        _y = 0;<br>    }<br>    Point2D(int x, int y) : _x(x), _y(y) {<br>    }<br>    int x() {return _x;} <br>    int y() {return _y;} <br>    void x(int x) {<br>         _x = x;<br>    }<br>    void y(int y) {<br>         _y = y;<br>    }<br>private:<br>    int _x;<br>    int _y;<br>}; </pre>
<br>
接着定义Point3D类别,它公开继承Point2D类别:<br>
<ul>
  <li>Point3D.h</li>
</ul>
<pre>#include "Point2D.h"<br><br>class Point3D : public Point2D { <br>public: <br>    Point3D() { <br>        _z = 0; <br>    } <br>    Point3D(int x, int y, int z) : Point2D(x, y), _z(z) { <br>    } <br>    int z() {return _z;}<br>    void z(int z) {_z = z;}<br>    <br>private:<br>    int _z;<br>}; </pre>
<br>
当您公开继承某个类别时,该成员的所有public成员都可以在衍生类别中被呼叫使用,而private成员则不可以直接在衍生类别中被呼叫使用;在这个
例子中,Point2D中已经有_x,
_y两个成员,而继承之后新增_z成员,在函式上您新增public的z()方法,而x()与y()直接继承父类别中已定义的内容。 <br>
<br>
在继承某个类别之后,您可以一并初始父类别的建构函式,以完成相对应的初始动作,这可以使用<span
 style="font-weight: bold;"> : </span>运算子并加上父类别建构函式名称,至于无参数的预设建构函式,在生成衍
生类别物件时,基底类别的无参数建构函式会自动被呼叫。 <br>
<br>
父类别的public成员可以直接在衍生类别中使用,而private成员则不行,private类别只限于定义它的类别来存取,如果您想要与父类别的
private成员沟通,就只能透过父类别中继承下来的public函式成员,例如上例中的x()与y()方法。 <br>
<br>
来看看一个使用Point3D的例子:<br>
<ul>
  <li>main.cpp</li>
</ul>
<pre>#include &lt;iostream&gt;<br>#include "Point3D.h"<br><br>using namespace std;<br><br>int main() {<br>    Point3D p1(1, 3, 4);<br>    Point3D p2; <br><br>    cout &lt;&lt; "p1: (" <br>         &lt;&lt; p1.x() &lt;&lt; ", " <br>         &lt;&lt; p1.y() &lt;&lt; ", " <br>         &lt;&lt; p1.z() &lt;&lt; ")"<br>         &lt;&lt; endl;<br>         <br>    p2.x(5);<br>    p2.y(7);<br>    p2.z(8);<br>    <br>    cout &lt;&lt; "p2: (" <br>         &lt;&lt; p2.x() &lt;&lt; ", " <br>         &lt;&lt; p2.y() &lt;&lt; ", " <br>         &lt;&lt; p2.z() &lt;&lt; ")"<br>         &lt;&lt; endl;<br>             <br>    return 0;<br>}</pre>
<span class="postbody"><br>
执行结果:</span><br>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2"
 cellspacing="2">
  <tbody>
    <tr>
      <td style="background-color: rgb(0, 0, 0);"><small><span
 style="color: rgb(255, 255, 255);">p1: (1, 3, 4)<br>
p2: (5, 7, 8)<br>
      </span></small><span style="color: rgb(255, 255, 255);"> </span></td>
    </tr>
  </tbody>
</table>
<br>
公开继承时,父类别与子类别之间是<span style="font-weight: bold;">"is-a"</span>的关系,白话来说,假
设父类别是A类的话,公开继承的子类也<span style="font-weight: bold;">“是一种”</span>A类。<br>
<br>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -