C++类 继承 (笔记)

写在前面
偶是1024Person,目前还只是C++道路上的一只小白
记笔记就要写博客

继承

  • _理论概念_
  • _使用语法_
  • _继承中的构造和析构_
  • _多继承_
  • _菱形继承_

继承作为类的三大特性之一,在C++中占据着极为重要的地位!!!通过继承来实现快速的扩展功能,在不改变源代码的情况下进行功能的快速扩展,这也是继承的最大的用处之一
虽然重要,但是并不难

理论概念

1、在C++中,继承描述的是类与类之间的关系的,继承是一个很简单也很直观的概念,类似于现实生活中的儿子继承父亲的财产
2、被继承的类叫做基类(父类),继承的类叫做派生类(子类)
3、子类继承父类之后,子类拥有父类中除构造函数和析构函数之外的所有成员

使用语法

class 类名(子类) : 继承方式 要继承的类(父类)
下面是具体的代码实现,

class A//基类
{
public:
	int money;
}
class B:public A//派生类继承基类
{
public:
	int age;
}

通过B类继承了A类,那么B类中就拥有了A类中除构造函数和析构函数之外的所有成员

子类继承父类之后:
1’、子类拥有父类中除构造函数和析构函数所有函数成员和数据成员
2、可以在子类中添加父类没有的数据和方法
3、子类继承的来的父类成员不一定都能直接访问,这和继承方式和父类成员的访问属性有关

关于继承方式:访问属性有三种,相应的继承方式也有三种
1、public公有继承 · 2、protected保护继承 3、private私有继承
关于从父类中继承来的成员属性,如下表

访问属性 and 继承方式 public(继承) protected(继承) private(继承)
public(父类成员属性) public(公有) protected(保护) 可以继承但是不可以直接访问
protected(父类成员属性) protected(保护) protected(保护) 可以继承但是不可以直接访问
private(父类成员属性) private(私有) private(私有) 可以继承但是不可以直接访问

注意父类中的私有成员无论以哪一种方式继承,都是不可以直接访问的(即使是在子类内部也不能访问,只能从父类中提供同接口)

在这一点上要和以私有的方式继承父类,产生的私有成员进行区分,以私有的方式继承父类那么父类种保护属性和公有属性的都变成私有属性,这个私有属性是在子类中的私有而不是在父类中的私有,所以在子类内可以直接访问这些私有成员

继承中的构造和析构

子类继承父类之后,
当用子类进行实例化对象的时候,会先调用父类的构造函数,先将父类构造出来,然后再构造出子类来(毕竟是先有鸡后有蛋),
当子类对象死亡的时候,会先调用子类的析构函数,然后再调用父类的析构函数,这里析构的顺序和栈的结构有关
注意:子类继承父类,如果想要在子类中调用父类的带参构造函数,就只需要在子类的构造函数后面加上父类的构造函数
写法:子类的构造函数:父类的带参构造函数
如下(这段代码也可以验证子类实例化对象时,父类和子类的构造函数和析构函数的调用顺序)

class Base
{
	int money;
public:
	//父类的构造函数,初始化money
	Base(int money)
	{
		this->money=money;
		cout<<"父类的构造函数"<<endl;
	}
	~Base()//析构
	{
		cout<<"父类的析构含函数"<<endl;
	}	
};
class Son:public Base
{
public:
//
	Son(int money):Base(money)
	{
		cout<<"子类的构造函数"<<endl;
	}
	~Son()
	{
		cout<<"子类的析构函数"<<endl;	
	}
};
int main()
{
	{
		Son s(456);//实例化一个子类对象,并且调用带参构造
	}
	return 0;
}

多继承

概念一个子类有多个父类

class A:public B,public C//子类A继承了B类和C类

下图能更好的说明这种关系
C++类 继承 (笔记)_第1张图片
一个子类继承多个父类

菱形继承

class A//基类A
{
public:
	int a;
};
class B:public A//B类继承A类
{
public: 
 int b;
};
class C:public A//C类继承A类
{
public:
	int c;
};
class D:public B,public C//D类继承B类,继承C类
{
public:
	int d;
};
int main()
{
	D d;
	cout<<d.a<<endl;//调用d中的a,报错
	return 0;
}

图片示意
C++类 继承 (笔记)_第2张图片

问题的产生: 可以发现,在D中有两份a,一份来自B,一份来自C,那么当d.a的时候会使用哪一个a呢?这就是a的路径不明确
解决办法:使用虚继承的办法,使用virtual关键字,在继承方式的前面加上virtual关键字达到虚继承的目的,最后就不会报错了,

class A//基类A
{
public:
	int a;
};
class B:virtual public A//B类虚继承A类
{
public: 
 int b;
};
class C:virtual public A//C类虚继承A类
{
public:
	int c;
};
class D:public B,public C//D类继承B类,继承C类
{
public:
	int d;
};

写在后面
呼~写博客是真的锻炼人,记笔记的不二选择啊,,,哈哈哈,
通过写博客,对继承的知识点巩固了很多,加油!
博主现在也还是C++的小白一枚,如果有理解错误,还希望能指出,非常感谢,也请见谅

你可能感兴趣的:(c++知识点)