c++入门---------继承篇

学完c++面向对象基础后,紧随其后的便是继承了,可想而知继承的重要性!


一. 什么是继承

  1. 对于刚刚学完面向对象编程基础的朋友,看到这里的第一个问题就是什么是继承,这个可以直接从字面意思上理解,你可以继承其他人的财产,只要别人同意,同样对象也可以继承另一个对象的函数与变量。
  2. 在继承中,被继承的类称为基类或者父类,继承该类的类称为子类或者派生类。
  3. 继承可以最大限度的实现代码的复用。
  4. 下面给出继承的简单实例。
#include<iostream>
using namespace std;
class A{
private:
	int x;
	int y;
public:
	A(int a,int b)
	{
		x = a;
		b = b;
	};
	void disp()
	{
		cout<<x,y<<endl;
	}
};

class B:public A    #类B继承类A
{
private:
	int z;
public:
	B(int a,int b, int c):A(a,b),z=c;	
};
int main()
{
	B a(1,2,3);
	a.disp();   #类B可以调用类A的函数。

	return ;
}

在上述代码中,我们定义了类A和类B,类B继承类A,既类A称为父类或者基类,类B称为子类或者派生类。

二. 基类和派生类

  1. 基类

    1. 直接基类:B继承A,则A为B的直接基类。
    2. 间接基类:C继承B,B继承A,则A为C的间接基类。
  2. public和private派生

    1. 在两种派生方法当中,主要的区别就是基类对象在派生类中是私有的还是公开的,下面这个表格中归纳了一下。
派生方法 private private public public
基类成员 private成员 public成员 private成员 public成员
派生类中 不可见 private 不可见 public
外部 不可见 不可见 不可见 可见

可见无论采用那种方法基类的private成员在派生类中和外部都是不可见的,而public成员在private派生方法中,在派生类中是private的,public中的派生类中是public的。
3. protected派生
在上面的派生中,如果派生类在往下派生一类的话,那么基类的变量便会不可以访问了,为了解决这个问题,由此产生了protected派生。

protected protected protected
private protected public
不可见 private protected
不可见 不可见 不可见

三. 多基派生

  1. 一个类继承其他的多个类称为多基派生。其声明和定义为
派生类名(参数表):基类名1(参数),基类名2(参数),.....,基类名n(参数n)
{
private:

public:
};
  1. 在多派生中会存在一个二义性问题,下面通过代码来说明。
#include<iostream>
using namespace std;
class A{
	public:
		void print(){
		cout<<"hello c++"<<endl;
		}
};

class B{
	public:
		void print(){
		count<<"hello,c"<<endl;
		}
};

class C:public A,public B
{
	public:
		void disp()
		{
		print();
		}
};
int main()
{
	C a;
	a.disp();
	a.print();
	return 0;
}

在上述代码中,类A和类B中都有print函数,类C继承了A,B,在调用print函数的时候,编译器就不知道是那个类中的print函数,这样就出现了二义性。这个问题可以通过成员限定符来消除二义性。

a.A::print();

四. 虚基类

  1. 虚基类又是为了解决什么问题呢?这里四个类A,B,C,D,假如说,类B继承类A,类C也继承类A,类D继承类B和类C,这里便会出现一个问题,在类D中,会有两个类A的复制。
  2. 这样也会带来二义性。例如说,在类D中要调用类A中的函数,那会会出现是通过类B再到类A,还是通过类C再到类B呢?这便产生了二义性。
  3. 我们可以通过声明虚基类来消除类A在内存的双重复制,虚基类的定义为:
class 派生类名:virtual 派生方式 基类名
{
};
  1. 在回到上面的问题中,这时候如果我们类B继承的是虚基类A,类C继承的虚基类A,类D继承类B和类C,那么便不会出现内存中出现两个类A了,从而取消了二义性。

五. 派生类的构造函数和析构函数

派生时,由于构造函数和析构函数是不能被继承的,所以对派生类我们需要重新定义。在创建派生类对象时,系统首先通过派生类的析构函数来调用基类的构造函数,完成基类成员的初始化,而后对派生类中新增的成员进行初始化。

  1. 派生类构造函数的一般格式为
    派生类名 (派生类构造函数参数列表): 基类构造函数(基类构造函数参数列表){};

  2. 必须将基类的构造函数放在派生类的初始化表达式中,一调用基类构造函数完成基类数据成员的初始化,派生类构造函数实现的功能如下:

    1. 完成对象所占整块内存的开辟,由系统在构造函数时自动完成。
    2. 调用基类的构造函数完成基类成员的初始化。
    3. 若派生类中含对象成员、const成员或引用成员,则必须在初始化表中初始化。
    4. 派生类构造函数体执行。
  3. 派生类的析构函数

    1. 在对象被删除的时候,自动调用析构函数,其调顺序为先派生类,后基类。

Thank for your reading!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章