C++中的继承

C++的三种继承方式

#include <iostream>
using namespace std;

class father
{
	public:
		int a;
	private:
		int b;
	protected:
		int c;
};

class son1 : public father
{
	public:
		void fun()
		{
			a = 10;		//父类中是公共权限,子类依然是公共权限
			cout << "公共继承,访问父类公共权限" << endl;
		//	b = 11;		//父类中是私有权限,子类无法访问
			c = 12;		//父类中是保护权限,子类依然是保护权限
			cout << "公共继承,访问父类保护权限" << endl;
		}
};

class son2 : protected father
{
	public:
		void fun()
		{
			a = 10;		//父类中是公共权限,子类变成保护权限
			cout << "保护继承,访问父类公共权限" << endl;
		//	b = 11;		//父类中是私有权限,子类无法访问
			c = 12;		//父类中是保护权限,子类依然是保护权限
			cout << "保护继承,访问父类保护权限" << endl;
		}
};

class son3 : private father
{
	public:
		void fun()
		{
			a = 10;		//父类中是公共权限,子类变成私有权限
			cout << "私有继承,访问父类公共权限" << endl;
		//	b = 11;		//父类中是私有权限,子类无法访问
			c = 12;		//父类中是保护权限,子类变成私有权限
			cout << "私有继承,访问父类保护权限" << endl;
		}
};

int main(void)
{
	son1 s1;
	s1.fun();

	son2 s2;
	s2.fun();

	son3 s3;
	s3.fun();
}

2.父类中所有非静态成员属性都会被子类继承,也就是说会分配空间,只是子类访问不到
3.继承的时候,先构造父类,再构造子类,析构的顺序和构造的顺序相反

1.继承同名成员处理方式
	访问子类的成员,直接访问即可		s.fun();			s.a
	访问父类的成员,加上父类的作用域		s.father::fun();		s.father::a

4.子类的构造函数必须要为父类的初始化成员变量传递参数

1.父类是有参构造函数,子类要为父类传递参数
#include <iostream>
#include <string.h>
using namespace std;

class A
{
	public:
		int a;
		A(int a)
		{
			this->a = a;
			cout << "A constructor" << endl;
			cout << "a = " << this->a << endl;
		}
};

class B : public A
{
	public:
		int b;
		B(int b) : A(b)		//第一种方式,传递一个参数,a和b的值相等,或者直接将b改成数字,直接赋值
		//B(int a, int c) : A(c)		第二种方式,传递两个参数
		{
			this->b = b;
			cout << "B constructor" << endl;
			cout << "b = " << this->b << endl;
		}
};

int main(void)
{
	B var(10);		//第一种方式,传递一个参数,a和b的值相等,或者直接将b改成数字,直接赋值
	//B var(10,11)		第二种方式,传递两个参数
}

2.若父类为无参构造函数,则可以不用传参
3.若父类为有参否早函数,子类不可以为默认构造函数,但可以是无参构造函数,且必须穿参数
B() : A(10);
B var;
以这种方式传参,且父类的参数只能是常数,不能在 main函数中指定

5.多继承的调用顺序

构造函数的调用顺序按照声明的顺序来
class B : public A, public C
{
	public:
		int b;
		B(int a, int b, int c) : C(c), A(a)		//a = 1, c = 3, b = 2,先调用A,后调用C,最后B
		{
			this->b = b;
			cout << "B constructor" << endl;
			cout << "b = " << this->b << endl;
		}
};

int main(void)
{
	B var(1, 2, 3);
}

6.继承中同名成员函数或者对象的调用方法

子类会屏蔽父类的同名成员函数,想要调用需要加上作用域
1.通过对象调用:
	s.fun();
	s.father::fun();
	s.m;
	s.father::m;
2.通过类名调用(静态变量或者静态函数可以不通过对象调用,当然也可以通过对象调用)
	son::fun();
	son::father::fun();
	son::m;
	son::father::m;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值