C++继承的概念及语法

继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似。

继承可以理解为一个类从另一个类获取方法(函数)和属性(成员变量)的过程。如果类 B 继承于类 A,那么 B 就拥有 A 的方法和属性。被继承的类称为父类或基类,继承的类称为子类或派生类。

上一章我们例举了不少 book 类相关的示例,book 类中有两个成员变量:title 和 price,即书的名字和价格。如果我们要按照编程语言将这些书进行分类,需要第三个成员变量 language,此时没有必要重新设计一个全新的类,只需要在 book 类的基础上加上 language 属性及其相关的方法即可。

只要将 codingbook 类继承 book 类,就可以得到 book 类的成员变量及成员函数,继承后在添加需要的 language 属性和相关的方法。新类 codingbook 叫做 book 类的派生类或子类,而原有的 book 类则称为基类。派生类 codingbook 除了能够拥有基类 book 的所有数据成员和成员函数之外,还可以拥有基类没有的 language 成员变量及其相关成员函数。

由于派生类可以将基类的代码继承过来,无需重新设计,因而继承解决了代码重用的问题,大大提高了软件的开发效率。同时如果这些代码在基类中运行无误,则继承之后到派生类中运行也是不会有问题的。

继承并非只能进行一层,可以是任意层次的。比如 codingbook 继承自 book 类,如果我们需要对 codingbook 类继续添加某一新属性时,同样可以设计一个类继承自 codingbook 类。

从 book 类中派生出 codingbook 类的语法如下例所示。
enum language{cpp, java, python,javascript, php, ruby};

class book
{
public:
    void setprice(double a);
    double getprice()const;
    void settitle(char* a);
    char * gettitle()const;
    void display();
private:
    double price;
    char * title;
};

class codingbook: public book
{
public :
    void setlang(language lang);
    language getlang(){return lang;}
private:
    language lang;
};
为了方便起见,我们先在类定义前声明了一个全局的枚举类型 language,用于表示编程语言。book 类我们已经很熟悉了,关键是 codingbook 类的定义。

定义 codingbook 类时多出了: public book,除此之外 codingbook 类的定义和上一章介绍的类定义方法没有什么差别。其中关键字 public 指明继承方式属于公有继承,book 为被继承的类名。

采用公用继承方式,则基类的公有成员变量和成员函数的属性继承到派生类后不发生变化。例如 book 类的公有的 setprice() 和 settitle() 成员函数继承到 codingbook 类后,这两个成员变量的属性仍将是 public 属性。如果在继承过程中不指名继承方式时,编译器系统会默认继承方式为 private 或 protected 属性。

通过公有继承的方式,codingbook 类继承了 book 类中的所有成员及成员函数,并新增 language 属性及相应的操作函数。虽然我们可以继承到 book 类的私有成员,但是 book 类的私有成员变量在派生类中我们是无法直接访问的,只能通过间接的方式访问。间接访问则是通过 getprice()、gettitle()、setprice() 和 settitle() 函数来实现的,因为这些函数在派生类中是 public 属性的。如下表所示为 codingbook 类中的所有成员的一览。

codingbook类成员 成员属性 来源
price 不可访问 继承自 book 类
title 不可访问 继承自 book 类
lang private codingbook 新增
setprice public 继承自 book 类
settitle public 继承自 book 类
getprice public 继承自 book 类
gettitle public 继承自 book 类
dispaly public 继承自 book 类
setlang public codingbook 新增
getlang public codingbook 新增