10c++继承

1、继承语法

class A : public B;

A 类称为子类 或 派生类

B 类称为父类 或 基类

2、继承方式

3、继承中的对象模型

#include<iostream>
using namespace std;

class Base
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};

class Son :public Base
{
public:
	int m_D;
};

//利用开发人员命令提示工具查看对象模型
//跳转盘符
//跳转文件路径 :cd 具体路径
//查看命名
//cl /d1 reportSingleClassLayout类名 文件名  例:01继承中的对象模型.cpp
void test()
{
	//父类中所有非静态成员属性都会被子类继承下去
	//父类中私有成员属性 是被编译器给隐蔽了,因此访问不到,但是确实被继承下去了
	cout << "Size of Son = " << sizeof(Son) << endl;
}
int main()
{
	test();
	return 0;
}

4、构造函数和析构函数的顺序

class Base 
{
public:
	Base()
	{
		cout << "Base构造函数!" << endl;
	}
	~Base()
	{
		cout << "Base析构函数!" << endl;
	}
};

class Son : public Base
{
public:
	Son()
	{
		cout << "Son构造函数!" << endl;
	}
	~Son()
	{
		cout << "Son析构函数!" << endl;
	}

};


void test01()
{
	//继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
	Son s;
}

int main() {

	test01();

	system("pause");

	return 0;
}

5、继承中同名成员的处理方法

#include<iostream>
using namespace std;

class Base
{
public:
	Base()
	{
		m_A = 100;
	}
	void show()
	{
		cout << "Base的成员函数" << endl;
	}
	void show(int a)
	{
		cout << "Base的int a成员函数" << endl;
	}
	int m_A;
};

class Son :public Base
{
public:
	Son()
	{
		m_A = 200;
	}
	void show()
	{
		cout << "Son的成员函数" << endl;
	}



	int m_A;
};
//同名属性的访问方式
void test01()
{
	Son son;
	cout << son.m_A << endl;
	cout << son.Base::m_A << endl;

}
//同名函数的访问方式
void test02()
{
	Son son;
	son.show();
	son.Base::show();
	//如果子类中出现和父类同名的成员函数,子类的同名成员函数会隐藏父类中所有的同名成员函数,
	// 无论父类的成员函数是否有参或者其他重载函数情况
	
	son.Base::show(100);
}
int main()
{
	//test01();
	test02();
	return 0;
}

6、同名静态成员处理

#include<iostream>
using namespace std;

class Base
{
public:
	//1、同名静态成员属性
	static int m_A;
	//2、同名静态成员函数 
	static void func()
	{
		cout << "Base static void func()" << endl;
	}
};
int Base::m_A = 100;

class Son :public Base
{
public:
	static int m_A;
	static void func()
	{
		cout << "Son static void func()" << endl;
	}
};
int Son::m_A = 200;

//1、访问同名静态成员属性
void test04()
{
	//1、通过对象访问
	Son s;
	cout << s.m_A << endl;
	cout << s.Base::m_A << endl;

	//2、通过类名访问
	cout << Son::m_A << endl;
	//第一个::代表通过类名方式访问   第二个::代表访问Base作用域下
	cout << Son::Base::m_A << endl;
}
//2、访问同名静态成员函数
void test02()
{
	//静态成员有两种访问方式
	//1、通过对象访问
	Son s;
	s.func();
	s.Base::func();

	//2、通过类名访问
	Son::func();
	//第一个::代表通过类名方式访问   第二个::代表访问Base作用域下
	Son::Base::func() ;
}


int main()
{
	test02();

	return 0;
}

7、多继承语法

不建议去使用!

#include<iostream>
using namespace std;

class Base1
{
public:
	Base1()
	{
		m_A = 100;
	}
	int m_A;

};

class Base2
{
public:
	Base2()
	{
		m_A = 200;
	}
	int m_A;

};

class Son :public Base1, public Base2
{
public:
	Son()
	{
		m_C = 300;
		m_D = 400;
	}
	int m_C;
	int m_D;
};

void test()
{
	Son s;
	cout << "Sizeof Son = " << sizeof(Son) << endl;
	//多继承下的m_A同名,所以要加作用域区分
	cout << s.Base1::m_A << endl;
	cout << s.Base2::m_A << endl;
}
int main()
{
	test();
	return 0;
}

8、菱形继承及解决方法

用虚继承

#include<iostream>
using namespace std;


class Animal
{
public:
	int m_Age;
};
//利用虚继承解决菱形继承的问题
//继承之前加上  virtual  变成虚继承
//Animal为虚基类
class Sheep:virtual public Animal {};

class Tou :virtual public Animal {};

class SheepTou :public Sheep, public Tou{};

void test()
{
	SheepTou cnm;
	cnm.Sheep::m_Age = 18;
	cnm.Tou::m_Age = 28;
	//当菱形继承时,两个父类拥有相同的数据,需要加以作用域区分
	cout << cnm.Sheep::m_Age << endl;
	cout << cnm.Tou::m_Age << endl;

	cout << cnm.m_Age << endl;
}

int main()
{
	test();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值