这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
C++类继承
类继承对于类来说是个必要的特性,其对于面向对象的程序设计十分重要,在python与js中,我就接触并使用过类继承。在这些语言中,由于类继承的语法和思维都比较易懂,我并没有花太多的心思去钻研类继承的诸多细节。
在C++中,比如说有这样一个类:
class TableTennisPlayer {
private:
string firstname;
string lastname;
bool hasTable;
public:
TableTennisPlayer (const string & fn = “none", const string & ln = “none", bool ht = false);
void Name() const;
bool HasTable() const {
return hasTable;
};
void ResetTable(bool v) {
hasTable = v;
};
};
要进行类继承(或称为类派生)很简单,只要
class RatedPlayer : public TableTennisPlayer { ... }
这样就ok了。这样的派生类天然具有父类的变量和方法。但是派生类有其自己的独立的构造与析构函数,并不依赖于父类。
关于派生类如何处理父类的变量,遵循一些权限原则,注意class RatedPlayer : public TableTennisPlayer { ... }中的public,这声明了继承的方式,三种继承方式和对应的变量权限如下:
public继承方式
- 基类中所有 public 成员在派生类中为 public 属性;
- 基类中所有 protected 成员在派生类中为 protected 属性;
- 基类中所有 private 成员在派生类中不能使用。
protected继承方式
- 基类中的所有 public 成员在派生类中为 protected 属性;
- 基类中的所有 protected 成员在派生类中为 protected 属性;
- 基类中的所有 private 成员在派生类中不能使用。
private继承方式
- 基类中的所有 public 成员在派生类中均为 private 属性;
- 基类中的所有 protected 成员在派生类中均为 private 属性;
- 基类中的所有 private 成员在派生类中不能使用。
可见派生类无法直接访问private属性,因而对于派生类而言唯一访问private属性的方法就是调用父类的public方法(如果存在的话)来曲线救国。