欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++基础学习10:继承

程序员文章站 2022-04-09 20:22:34
从基类派生出派生类,派生类继承基类的继承方式有三种:public、protected和private。在未指定的情况下编译器会默认继承方式为protected或private方式。1) public继承方式 • 基类中所有public成员在派生类中为public属性; • 基类中所有protecte ......
 
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似。
继承可以理解为一个类从另一个类获取方法(函数)和属性(成员变量)的过程。如果类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类的语法如下例所示。
例1: 
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属性。 在本例中因为已经定义过一个book类,具有book类的基本属性:书名和书的价格。现在需要一个新的类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新增



C++继承方式:

从基类派生出派生类,派生类继承基类的继承方式有三种:public、protected和private。在未指定的情况下编译器会默认继承方式为protected或private方式。
1) public继承方式
• 基类中所有public成员在派生类中为public属性;
• 基类中所有protected成员在派生类中为protected属性;
• 基类中所有private成员在派生类中不可访问。
• 具体示例可以参考上一节中的例1,在此就不再重新举例了。
2) protected继承方式
• 基类中的所有public成员在派生类中为protected属性;
• 基类中的所有protected成员在派生类中为protected属性;
• 基类中的所有private成员在派生类中仍然不可访问。
例1:
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 : protected book
{
public :
  void setlang(language lang);
  language getlang(){return lang;}
private:
  language lang;
};
本类同样使用上一节中的示例,此时继承方式改为了protected继承,我们再来分析一下codingbook中类成员的属性问题,具体见下表。

codingbook类成员

成员属性

来源

price 不可访问 继承自book类
title 不可访问 继承自book类
lang private codingbook新增
setprice protected 继承自book类
settitle protected 继承自book类
getprice protected 继承自book类
gettitle protected 继承自book类
dispaly protected 继承自book类
setlang public codingbook新增
getlang public codingbook新增

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3) private继承方式
  • 基类中的所有public成员在派生类中均为private属性;
  • 基类中的所有protected成员在派生类中均为private属性;
  • 基类中的所有private成员在派生类中均不可访问。


例2:


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 : private book
{
public :
  void setlang(language lang);
  language getlang(){return lang;}
private:
  language lang;
};

同样,我们来分析一下本例中的codingbook类中所有成员的成员属性,具体见下表。

codingbook类成员

成员属性

来源

price 不可访问 继承自book类
title 不可访问 继承自book类
lang private codingbook新增
setprice protected 继承自book类
settitle protected 继承自book类
getprice protected 继承自book类
gettitle protected 继承自book类
dispaly protected 继承自book类
setlang public codingbook新增
getlang public codingbook新增