C++ 类的继承,基类,派生类

继承:

当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。

这个已有的类称为基类,新建的类称为派生类。在这里插入图片描述
例:

	//基类
	class Animal {
	    // eat() 函数
	    // sleep() 函数
	};
	
	//派生类
	class Dog : public Animal {
	    // bark() 函数
	};

派生类的定义:
类派生列表以一个或多个基类命名,形式如下:

class derived-class: access-specifier base-class//access-specifier 是 public、protected 或 private 其中的一个

base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。

例:

	#include <iostream>
 
	using namespace std;
	 
	// 基类
	class Shape 
	{
	   public:
	      void setWidth(int w)
	      {
	         width = w;
	      }
	      void setHeight(int h)
	      {
	         height = h;
	      }
	   protected:
	      int width;
	      int height;
	};
	 
	// 派生类
	class Rectangle: public Shape
	{
	   public:
	      int getArea()
	      { 
	         return (width * height); 
	      }
	};
	 
	int main(void)
	{
	   Rectangle Rect;
	 
	   Rect.setWidth(5);
	   Rect.setHeight(7);
	 
	   // 输出对象的面积
	   cout << "Total area: " << Rect.getArea() << endl;
	 
	   return 0;
	}

访问控制和继承
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。

我们可以根据访问权限总结出不同的访问类型,如下所示:

-访问-- public --protected--private-
同一个类yesyesyes
派生类yesyesno
外部的类yesnono

一个派生类继承了所有的基类方法,但下列情况除外:

基类的构造函数、析构函数和拷贝构造函数。
基类的重载运算符。
基类的友元函数。

继承类型
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型

当使用不同类型的继承时,遵循以下几个规则:

公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。

多继承

C++ 类可以从多个类继承成员,语法如下:

	class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,//各个基类之间用逗号分隔
	{
	<派生类类体>
	};

例:

	#include <iostream>
	 
	using namespace std;
	 
	// 基类 Shape
	class Shape 
	{
	   public:
	      void setWidth(int w)
	      {
	         width = w;
	      }
	      void setHeight(int h)
	      {
	         height = h;
	      }
	   protected:
	      int width;
	      int height;
	};
	 
	// 基类 PaintCost
	class PaintCost 
	{
	   public:
	      int getCost(int area)
	      {
	         return area * 70;
	      }
	};
	 
	// 派生类
	class Rectangle: public Shape, public PaintCost
	{
	   public:
	      int getArea()
	      { 
	         return (width * height); 
	      }
	};
	 
	int main(void)
	{
	   Rectangle Rect;
	   int area;
	 
	   Rect.setWidth(5);
	   Rect.setHeight(7);
	 
	   area = Rect.getArea();
	   
	   // 输出对象的面积
	   cout << "Total area: " << Rect.getArea() << endl;
	 
	   // 输出总花费
	   cout << "Total paint cost: $" << Rect.getCost(area) << endl;
	 
	   return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值