C++学习 2018-11-26

本文详细介绍了C++中的继承概念,包括继承的基本语法、派生类与基类的关系、成员函数的重写以及多态性的实现。通过具体代码示例,阐述了不同继承方式下成员的访问权限,构造与析构的顺序,以及如何利用虚函数实现多态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++学习 2018-11-26

1.继承

1.继承是指将父类的内容拷贝一份到子类中
2.语法:
class CChina:public CPerson
	派生类(子类)	基类(父类)
3.继承的作用

继承是为了提升复用的。

4.派生类的大小

父类的大小 + 自己的大小

5.同名成员

基类与派生类中有同名的成员时,通过作用域来区分(调用)相同的成员

class CFather
{
public:
	int n_num;
};

class CSon:public CFather
{
public:
	int n_num;
};

int main()
{
	CSon son;
	son.n_num = 100;				// 将 CSon 中的成员属性赋值为100
	son.CFather::n_num = 200;		// 将 CFather 中的成员属性赋值为200

	return 0;
}
6.创建一个父类、一个子类,修改子类中继承的父类的成员,父类对象中的该成员不变。
son.CFather::n_num = 10;			// father.n_num 原来是多少,现在还是多少,不改变
7.继承方式

1.无论什么继承方式,基类中的 private 都是不可访问的;

class CFather
{
private:
	int f_n_age;
};

class CSon:public(private、protected) CFather
{
public:
	void Show()
	{
		cout << f_n_age << endl;		// 会出错,因为无法读取得 private 的成员
	}
};

2.public继承:public的成员不变,protected的成员不变,private的成员变成不可访问。

3.protected继承:public的成员变成protected,protected的成员不变,private的成员变成不可访问。

4.private继承:public的成员变成private,protected的成员变成private,private的成员变成不可访问。

5.以上所有继承方式都可以进行验证(可通过一次继承与多次继承进行验证)。

8.继承的构造与析构

1.先执行父类的构造,再执行子类的构造,再执行子类的析构,再执行父类的析构(类似于栈,先进后出FILO)。

class CFather
{
public:
	CFather()
	{
		cout << "CFather()" << endl;
	}

	~CFather()
	{
		cout << "~CFather()" << endl;
	}
};

class CSon:public CFather
{
public:
	CSon()
	{
		cout << "CSon()" << endl;
	}

	~CSon()
	{
		cout << "~CSon()" << endl;
	}
};

int main()
{
	CSon son;
	return 0;
}

结果为:CFather() CSon() ~CSon() ~CFather()

2.在一个类B中的成员属性包含另一个类A的对象,A的析构函数有参数,则执行B类的构造函数时必须在初始化列表中指定A的构造函数。

class CFather
{
public:
	CFather(){}
	~CFather(){}
};

class CSon:public CFather
{
public:
	CFather father;

public:
	CSon():CFather(123){}
	~CSon(){}
};

3.在自己类中成员属性不能定义自己类的对象,但是在成员函数中可以定义自己类的对象。

9.父类指针 指向 子类对象

1.因为子类对象是由 父类+子类 构成的,因此父类指针是可以指向子类对象的。

class CFather
{
};

class CSon:public CFather
{
};

CSon son;
CFather *p_father = &son;

2.优点:同一类型,提高复用性
缺点:只能用父类的成员,不能用子类的成员。
解决方法:多态

2.多态

1.多态的例子

1.在父类中声明一个virtual函数(虚函数),在子类中重写(函数名、返回值与父类的成员函数完全一样)父类函数,之后通过调用父类的成员函数就可以调用子类的成员函数。

2.虚函数:virtual
作用:允许用父类的指针使用子类的成员函数。

class CTraffic
{
public:
	virtual void Run()
	{
		cout << "CTraffic::Run()" << endl;
	}
};

class CCar:public CTraffic
{
public:
	void Run()
	{
		cout << "CCar::Run()" << endl;
	}
};

class CPlane:public CTraffic
{
public:
	void Run()
	{
		cout << "CPlane::Run()" << endl;
	}
};

class CBus:public CTraffic
{
public:
	void Run()
	{
		cout << "CBus::Run()" << endl;
	}
};

class CPerson
{
public:
	void Visit(CTraffic *traf)
	{
		cout << "Les't GO";
		traf->Run();
	}
};

int main()
{
	CCar *car = new CCar;
	CPlane *plane = new CPlane;
	CBus *bus = new CBus;

	CPerson xiaoming;
	xiaoming.Visit(car);
	xiaoming.Visit(bus);
	xiaoming.Visit(plane);

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值