[1.x] 实现与概念
| 有时候我们希望某些类具有另外一个类的所有特征,并且通常会引入新的特征和方法,而利用一个已有的类创建一个这样的新的类,就是继承Inheritance。```cpp class Base{ // … };
class Derived : (public/private/protected) Base{ // Derived类继承了Base类 // … };
/*
- Derived d;
- Base p = &d; // 这件事是合法的,叫向上造型upcast
/
`` <br />- 如果
B继承了
A,那么
B中会有所有和
A的成员变量/函数一样的成员变量/函数<br />- 在
A中私有的部分会在
B中**被隐藏be hidden**,即无法在派生类中直接访问基类的私有成员;但他们仍然存在,使用
sizeof`你就会发现他们
- 但是需要注意,C’tor / D’tor / 重载的运算符 / 友元 并不会被继承
而继承的出现无疑能够提高代码重用率、也正是OOP的核心之一。> It’s nicer if we can take the existing class, clone it, and then make additions and modifications to the clone.
比如我们有一个类Shape
,表示一个形状类。接下来我们创建一个新的类Ellipse
并继承类Shape
,因为椭圆显然也是个形状。我们还可以创建一个新的类Circle
并继承Ellipse
,因为正圆显然也是个椭圆,当然也一定是个形状。
在上面这个类中,Shape
是Ellipse
的父类,也叫基类;Ellipse
是Shape
的子类,也叫派生类。> This is effectively what you get with inheritance, with the exception that if the original class ( [基类] called the base or super or parent class) is changed, the modified “clone” ( [派生类] called the derived _or inherited or sub or child_ class) also reflects those changes.
private ones are hidden away and inaccessible)(无法在派生类中直接访问基类的私有成员), but more importantly it duplicates the interface of the base class. That is, all the messages you can send to objects of the base class you can also send to objects of the derived class. Since we know the type of a class by the messages we can send to it, this means that the derived class is the same type as the base class. In the previous example, “a circle is a shape.” This type equivalence via inheritance is one of the fundamental gateways in understanding the meaning of object-oriented programming.
在派生类中,有两种方法来创建新的方法:
1. 创建一个新的函数
1. [更加理想]override一个基类中已有的函数
- 如果派生类override了一个函数,那么在基类中与之构成overloading关系的函数也会被隐藏
- 我们希望此时在父类中存在virtual
关键字
- 当父类与子类中存在函数名、参数表相同的函数时候,两个函数形成Override关系
is-a & is-like-a relationship
- 如果父类和子类仅存在override关系,而不存在新引入的方法,这意味着父类和子类可以直接替换(因为对外部来说他们的接口是一样的),这时它们就构成了is-a关系
- 反之,如果子类中引入了新的方法,那么他们无法直接或者无法完全替换,那么这时候构成is-like-a关系
|
| —- |
[2.x] 继承中的权限控制
| cpp
class B : (public/private/protected) A{
public:
// ...
private:
// ...
protected:
// ...
}
|
| —- |