首页 > 编程语言 >9、C++继承

9、C++继承

时间:2024-12-13 15:27:14浏览次数:6  
标签:继承 成员 float C++ void 基类 public

1、继承

1.1、认识继承

继承一般发生在家族图谱、动植物分类等,注意关系要合理

比如:

        学生:姓名  年龄  身高  学生编号

                  吃饭  睡觉  学习  

        老师:姓名  年龄  身高  教师编号

                  吃饭  睡觉  备课

        职工:姓名  年龄  身高  职工编号

                  吃饭  睡觉  工作

  

抽离出类中共同的部分组成人类。

人类:

        属性:姓名,年龄,身高

        方法:吃饭,睡觉

在设计程序时可以让学生类/教师类/员工类 继承 自 人类。

1.2、继承概念

继承发生在类与类之间,通过继承机制,可以利用已有的数据类型来定义新的数据类型,

所定义的新的类不仅拥有新定义的成员,还有继承来的成员。

已存在用来派生其他类的类叫基类或父类,由已存在的类派生出来的类叫派生类或者子类。

目的:类复用,提高效率,缩短开发周期。

继承的分类:单继承 、 多继承

继承过程:

        1、吸收父类成员 --- protected public

        2、覆盖基类同名成员

        3、添加新成员

2、继承使用

        继承分为单继承和多继承。

        2.1、单继承

                单继承:只有一个父类

                单继承定义格式:

                        class 派生类名:继承方式 基类名

                        {

                                // 新成员

                        };

                继承方式说明:将基类看做子类的成员,当子类创建对象时,以何种权限实现对其成员的访问。

                public:基类公有成员和保护成员保持原有的状态,父类私有成员不能在派生类中访问 

                                -- 一般设计成public

                private:基类公有成员和保护成员都作为派生类的私有成员

                protected:基类公有成员和保护成员都作为派生类的保护成员

        继承方式通常为public。

举例:

        设计3维坐标类,让它继承2维坐标Point类

#include<iostream>

using namespace std;

// Point -- 基类
class Point
{
private:
	int xp;
	int yp;
public:
	Point(int x=0,int y=0)
	{
		xp = x;
		yp = y;	
	}	
	void show()
	{
		cout << "父类:xp" << xp << ",yp" << yp << endl; 
	}
protected:
	void setXP(int x)
	{
		xp = x;		
	}
	
	int getXP(void)
	{
		return xp;
	}
	
	void setYP(int y)
	{
		yp = y;		
	}
	
	int getYP(void)
	{
		return yp;
	}		
};

// Point3D -- 子类 
class Point3D:public Point
{
private:
	int zp;
public:
	Point3D(int x=0,int y=0,int z=0):Point(x,y),zp(z)
	{
		
	}
	
	void show()
	{
		cout << "xp" << getXP() << ",yp" << getYP() << ",zp" << zp << endl;	
	} 
};


int main()
{
	Point3D a(1,2,3);
	a.show();
	 
	return 0;
}

注意:

        如果在子类初始化的时候想自动调用父类的构造函数只能用初始化表达式的形式

        设计类的时候一般属性设置为private protected public,但是成员函数一般设置成public.

2.2、多继承

        多继承:有多个父类,比如圆角矩形即会继承矩形的特点也会继承圆的特点。

        多继承定义格式:

                class 派生类名:继承方式 基类名,继承方式 基类名.......

                {

                };

        例子:

                设计圆角矩形类让其继承矩形类和圆类

         

#include<iostream>

#define PI 3.14

using namespace std;

class Rect
{
private:
	float width;
	float height;
public:
	Rect(float w=0,float h=0)
	{
		width = w;
		height = h;
	}
	float getArea(void)
	{
		return width * height;
	}
protected:
	void setWidth(float w)
	{
		width = w;
	}
	float getWidth(void)
	{
		return width;
	}
	void setHeight(float h)
	{
		height = h;
	}
	float getHeight(void)
	{
		return height;
	}		
};

class Circle
{
private:
	float radius;
public:
	Circle(float r=0)
	{
		radius = r;
	}
	float getArea(void)
	{
		return PI * radius * radius;
	}
protected:
	void setRadius(float r)
	{
		radius = r;
	}
	float getRadius(void)
	{
		return radius;
	}	
};

class RoundRect:public Rect,public Circle
{
public:
	RoundRect(float w=0,float h=0,float r=0):Rect(w,h),Circle(r)
	{
		
	}
	float getArea(void)
	{
		// 圆角矩形的面积 = 矩形面积 - 4 * (2r*2r-PI*r*r) 
		return Rect::getArea() - 4 * (2*getRadius()*2*getRadius()-Circle::getArea());
	} 
};

int main()
{
	RoundRect r1(2,4,1);
	float res = r1.getArea();
	cout << res << endl;
	return 0;
}

注意:

        多继承可能会遇到多个父类重定义了同名的属性或者成员函数造成二义性问题;  ambiguous

        解决方案:在属性或者成员函数前加  类名::

标签:继承,成员,float,C++,void,基类,public
From: https://blog.csdn.net/amyliyanice/article/details/144409495

相关文章

  • c++类详解
    学习转自:c++类详解-CSDN博客1#include<iostream>2usingnamespacestd;34classCircle{5private:6doubleradius;78public:9//构造函数10Circle(doubler){11radius=r;12}1314//计算面积15doub......
  • 【C++】AVL树
    AVL树概念AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。AVL树得名于它的发明者G.M.Adelson-Velsky和E.M.Landis是......
  • C++中多态性在实际项目中的应用场景有哪些?
    一、图形绘制系统:在一个图形绘制系统中,可以定义一个抽象的图形类,然后派生出各种具体的图形类,如圆形、矩形、三角形等。通过多态性,可以使用一个统一的接口来绘制不同类型的图形,而不需要为每种图形都编写单独的绘制函数。二、游戏开发在游戏开发中,不同的游戏角色可能有不同的......
  • 关于数据隐藏:为什么要进行数据隐藏?如何在C++中实现数据隐藏?以及数据隐藏对面向对象编
    一、为什么要进行数据隐藏?数据隐藏可以提高程序的安全性和可维护性。可以将数据成员声明为私有或受保护,可以防止外部代码直接访问和修改这些数据,从而减少错误的发生。同时,数据隐藏也使得类的内部实现细节对外部不可见,这样在修改类的内部实现时,不会影响外部代码的使用。二、......
  • JAVA中方法的重载,重写,继承
    Vehicle为父类Car及Truck继承了Vehicle继承的特性1.子类有父类非private的成员属性,成员方法(不继承父类的构造方法)2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展3.子类可以用自己的方式实现父类的方法,即方法的重写3.1三同原则:同方法名,同返回类型,同参数表3.2子......
  • C++ STL常用容器之deque&list
    文章目录一、序列式容器二、双端队列deque2.1容器属性2.2Deque特点三、迭代器操作3.1使用迭代器完成3.2迭代器函数四、双向链表list4.1容器属性4.2list特点4.3相比vector新增函数五、vectordequelist之间的区别六、vector&deque&list之间的转换一、序列......
  • 如何让子元素不继承父元素的:hover效果?
    要防止子元素继承父元素的:hover效果,你可以使用以下几种方法:1.使用CSS的pointer-events属性:这是最简单直接的方法。在子元素上设置pointer-events:none;,可以阻止子元素接收鼠标事件,从而避免继承父元素的:hover效果。.parent{/*父元素样式*/}.parent:hover......
  • C++实现希尔排序算法
    指定格式输入字母(字母间以空格分隔),按照希尔排序输出指定格式#include<iostream>#include<vector>#include<string>usingnamespacestd;voidshellSort(vector<string>&arr){ intn=arr.size(); //初始步长设置为数组长度的一半,后面逐步缩小步长直到值为1为止 for......
  • 面试必会(嵌入式)-C++面试高频(一)
    目录1.new和malloc的区别(使用和原理)⭐new的定义:malloc的定义:new与malloc的区别:(简单理解)new与malloc使用区别2.struct和class的区别⭐3.char和int之间的转换4.什么是野指针和悬挂指针⭐5.NULL和nullptr区别⭐6.指针常量和常量指针有何区别⭐7.虚拟内存和物理内存的......
  • C++构造函数和析构函数
    目录1构造函数1.1什么是构造函数?1.2无参构造函数1.3带参数构造函数2析构函数2.1什么是析构函数?1构造函数1.1什么是构造函数?类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造,那构造的是什么呢?构造成员变量的初始化值,内存空间等构造......