📄 publicinheritance.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: 公开(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 <iostream><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 << "p1: (" <br> << p1.x() << ", " <br> << p1.y() << ", " <br> << p1.z() << ")"<br> << endl;<br> <br> p2.x(5);<br> p2.y(7);<br> p2.z(8);<br> <br> cout << "p2: (" <br> << p2.x() << ", " <br> << p2.y() << ", " <br> << p2.z() << ")"<br> << 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 + -