c++第四次作业

继承与派生

知识要点

1.关于继承、派生

类的继承, 是新的类从已有类那里得到已有的特性。简单来说,就是在原有类的基础上做一些扩充。
定义方式:

class 派生类名:继承方式 基类名1,继承方式 基类名...
{
   派生类成员声明; /*对除了从基类继承来的成员之外,新增加的数据和函数成员的声明*/
};

例子

class person//定义一个person类
{
    string name[6];
    int age;
    char sex;
};
class student:public person/*定义student类,公有继承person类,那么student里面也有name、age、sex*/
{
    int id;
    int score;
};

[attention]在派生过程中构造函数和析构函数都不被继承
没有指明继承方式时默认private

2.三种继承方式

公有继承(public):基类的公有成员和保护成员在派生类中的访问属性不变,而基类的私有成员不可直接访问
私有继承(private):基类的公有成员和保护成员以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可直接访问
保护继承(protected):基类的公有成员和保护成员以保护成员身份出现在派生类中,而基类的私有成员在派生类中不可直接访问

呈现如下

继承方式 子类访问权限 类外对象访问权限
public 可以访问public、protected 可以访问public
private 可以访问public、protected 无法访问
protected 可以访问public、protected 无法访问

具体例子

#include"pch.h"
#include<iostream>
using namespace std;
class Point
{
public:
	int getX()
	{
		return x;
	}
	int getY()
	{
		return y;
	}
protected:
	void initial(int xx, int yy);
private:
	int x, y;
};
void Point::initial(int xx, int yy)
{
	x = xx;
	y = yy;
}
class Rectangle:public Point/*此处为公有继承,稍后会对继承方式进行改动*/
{
public:
	int getWidth()
	{
		return width;
	}
	int getLength()
	{
		return length;
	}
	void initial_1(int length, int width, int x, int y)
	{
		initial(x, y);//此处表明公有继承在派生类中可以访问基类的protected
		this->length = length;
		this->width = width;
	}
private:
	int length, width;
};
int main()
{
	Rectangle rec;
	rec.initial_1(3, 2, 9, 5);//访问基类的保护成员
	cout << rec.getLength()<<endl;
	cout << rec.getX();//访问基类的公有成员
	return 0;
}

对于公有继承在类外的访问

对于私有和保护继承在类外的访问

3.派生类的构造函数与析构函数

构造派生类的对象时,需要对基类的成员对象和新增成员对象进行初始化。但在继承的过程中,基类的构造函数不被继承,所以派生类的构造函数中的一些参数就需要传给基类的构造函数。
一般语法形式

派生类名::派生类名(参数表):基类名1(基类1初始化参数表),...,基类名n(初始化n参数表)
{
	派生类构造函数的其他初始化操作;
}

派生类构造函数执行的一般次序:

(1)调用基类构造函数,调用顺序按照他们被继承时声明的顺序
(2)对派生类新增的成员对象初始化时,调用顺序按照他们在类中声明的顺序
(3)执行派生类构造函数体中的内容

#include"pch.h"
#include<iostream>
using namespace std;
class A
{
public:A(int i)//有参数的构造函数
{
	cout << "constructing A " << i << endl;
}
};
class B
{
public:B(int j)//有参数的构造函数
{
	cout << "constructing B " << j << endl;
}
};
class C
{
public:C()//无参数的构造函数
{
	cout << "constructing C* " << endl;
}
};
class D :public A, public B, public C//公有继承
{
public:D(int a,int b,int c,int d):A(a),m1(d),m2(c),B(b)
{}
private:A m1;
		B m2 ;
		C m3;
};
int main()
{
	D d(1, 2, 3, 4);
	return 0;
}

构造代码结果

4.虚基类

声明语法形式

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

以实例来说明

#include"pch.h"
#include<iostream>
using namespace std;
class A
{
public:
	int a;
	void funa()
	{
		cout << "member of A" << endl;
	}
};
class B:virtual public A//以A为虚基类
{
public:
	int b;
};
class C :virtual public A//以A为虚基类
{
public:
	int c;
};
class D :public B, public C//D是B和C,以A为虚基类派生的
{
public:
	int d;
	void fun()
	{
		cout << "member of D" << endl;
	}
};
int main()
{
	D d;
	//直接访问虚基类的数据成员和函数成员
	d.a = 2;
	d.funa();
	return 0;

}

虚基类代码结果

posted on 2019-10-12 16:37  duoraemon  阅读(173)  评论(0编辑  收藏  举报