C++_继承(上)

C++(面向对象)

类和对象

继承

继承是面向对象三大特性之一

有些类与类之间存在特殊关系,下级别成员除了拥有上一级的共性,还有自己的特性,这时需要利用继承的技术,减少重复代码。

例:很多网站中,有公共头部,公共底部,甚至公共的左侧列表,只有中心内容不同,接下来分别利用普通写法和继承写法实现网页内容(黑马程序员网站首页)。

普通写法

#include 
using namespace std;

//普通写法
class Java{
	public:
		void Header()
		{
			cout<<"黑马程序员"<

继承写法

#include 
using namespace std;

//继承写法
class Base{  //父类 
	public:
		void Header()
		{
			cout<<"黑马程序员"<

同样的结果

C++_继承(上)_第1张图片

继承的好处:减少重复代码

1.继承的基本语法

  • class 子类 :继承方式 父类
  • 子类也称派生类,父类也称基类
  • 派生类中的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员;从基类继承过来的表现其共性,而新增的成员体现其个性。

2.继承方式

  • 继承方式一共有三种:公共继承(public);保护继承(protected);私有继承(private)
  • class B :继承方式 A (B为子类,A为父类)
#include 
using namespace std;

 //父类 
class Base{ 
	public:
		int m_A;
	protected:
		int m_B;
	private:
		int m_C;	 
};

//子类 
class Son1 : public Base{ //继承方式为公共类型 
	public:	
		void func()
		{
			m_A = 10; //公共类型 
			m_B = 10; //保护类型 
			//m_C = 10; //父类的私有类型,子类无法访问 
		}
};

class Son2 : protected Base{ //继承方式为保护类型 
	public:	
		void func()
		{
			m_A = 100; //保护类型 
			m_B = 100; //保护类型 
			//m_C = 100; //父类的私有类型,子类无法访问
		}
};

class Son3 : private Base{
	public:	
		void func()
		{
			m_A = 1000; //私有类型 
			m_B = 1000; //私有类型 
			//m_C = 1000; //父类的私有类型,子类无法访问 
		}
};

void test01()
{
	Son1 s1;
	s1.m_A = 100;  //类内的公共类型,类外可以访问
	//s1.m_B = 100;  //类内的保护类型,类外不可以访问
}

void test02()
{
	Son2 s2;
	//s2.m_A = 1000;  //类内的保护类型,类外不可以访问
	//s2.m_B = 1000;  //类内的保护类型,类外不可以访问
}

void test03()
{
	Son3 s3;
	//s3.m_A = 10000;  //类内的私有类型,类外不可以访问
	//s3.m_B = 10000;  //类内的私有类型,类外不可以访问
}

int main()
{
	test01();
	test02();
	test03();
	
	return 0;
 } 

3.继承中的对象模型

  • 问题:从父类继承过来的成员,哪些属于子类对象中?
#include 
using namespace std;

class Base{ 
	public:
		int m_A;
	protected:
		int m_B;
	private:
		int m_C;	 
};

class Son : public Base{ 
	public:	
		int m_D;
};

void test01()
{
	Son s;
	cout<

总结:父类中非静态成员属性都会被子类继承下去,父类中的私有成员属性被编译器隐藏,因此子类访问不到,但确实被继承下去。

:在Visual Studio中利用开发人员命令提示符可以查看对象模型,报告单个类布局。在文件的目录下:命令(cl /d1 reportSingleClassLayout类名 “文件名”),例如:


C++_继承(上)_第2张图片

4.继承中构造和析构的顺序

  • 子类继承父类后,当创建子类对象,也会调用父类的构造函数
  • 问题:父类子类的构造函数和析构函数顺序谁先谁后?
#include 
using namespace std;

class Base{ 
	public:
		Base()
		{
			cout<<"父类的构造函数"<

C++_继承(上)_第3张图片

总结:继承中,先调用父类的构造函数,再调用子类的构造函数,析构函数与构造函数相反。

你可能感兴趣的:(C++,c++)