栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

c++ day12 继承

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ day12 继承

1.公共继承方式

语法:class 子类(派生类) : 继承方式 父类(基类)

减少了重复代码

class basepage  //公共页面
{
public:
	void header()
	{
		cout << "公共头部" << endl;
	}

	void footer()
	{
		cout << "公共底部" << endl;
	}
};

class java :public basepage  //继承了公共页面
{
public:
	void content()
	{
		cout << "java学科页面" << endl;
	}
};

class cpp:public basepage  //继承了公共页面
{
public:
	void content()
	{
		cout << "cpp学科页面" << endl;
	}
};

void test()
{
	java ja; cpp c;
	ja.content();
	ja.footer();
	ja.header();
}

int main()   
{
	test();
	system("pause");              
	return 0;   
}

2.继承方式

公共继承保护继承私有继承

父类的私有,子类无法继承

class basepage1  //公共页面
{
public:
	int m_a;
protected:
	int m_b;
private:
	int m_c;	
};

//公共继承
class java :public basepage1  //继承了公共页面
{
private:
	void func()
	{
		m_a = 10; //必须写在函数里
		m_b = 10; //公共继承,父类中的属性权限不变
		//m_c = 10;  //父类中的私有不能继承
	}
};

//保护继承
class cpp:protected basepage1 
{
public:   //也可以写protected,private,子类权限设置只设置的func这个函数的权限,父类属性权限只与继承方式相关
	void func()
	{
		m_a = 10;  //保护继承,父类中的公共属性权限变为保护,其他不变
		m_b = 10;
		//m_c = 10;  //父类中的私有不能继承
	}
};

class cpp2 :public cpp
{
public:
	void func()
	{
		m_a = 10;
		//m_c = 10;//cpp2是子类的子类继承,所以私有权限属性无论怎样都权限都是私有
	}
};

//私有继承略
void test()
{
	java ja; cpp c; cpp2 epic;	
}

int main()   
{
	test();
	system("pause");              
	return 0;   
}

3.继承中的构造和析构顺序

子类继承父类后,也会调用父类的构造函数

4.继承同名成员

如果子类的函数与父类同名,则子类的函数会隐藏父类所有同名函数,包括重载版本,只要叫func,都隐藏

class first
{
public:
	int m_a;
	first()
	{
		m_a = 10;
	}
	void func()
	{
		cout << "first调用 " << endl;
	}
	void func(int a)
	{
		cout << "first调用 " << a << endl;
	}
};

class second :public first
{
public:
	int m_a;
	second()
	{
		m_a = 20;
	}
	void func()
	{
		cout << "second调用 " << endl;
	}
};

void test()
{
	second s;
	cout << s.m_a << "    " << s.first::m_a << endl;  //通过子类访问父类对象需加作用域
	//如果子类的函数与父类同名,则子类的函数会隐藏父类所有同名函数,包括重载版本,只要叫func,都隐藏
	s.first::func(100);
}

int main()
{
	test();
	system("pause");
	return 0;
}

5.继承同名静态成员

静态成员变量(1.类内声明,类外初始化  2.所有共用一个内存)

2.通过类名访问(静态成员共用一个数据),可不建立对象,直接访问
    //第一个::代表通过类名访问,第二个::表示父类作用域下
    cout << second::first::m_a << endl;  //通过子类这个类名访问父类作用域中的属性

class first
{
public:
	static int m_a;
	static void func()
	{
		cout << "first类函数" << endl;
	}
	static void func(int a)
	{
		cout << "first类函数" << a << endl;
	}
};

int first::m_a = 10; //静态成员变量类内声明类外初始化

class second :public first
{
public:
	static int m_a;
	static void func()
	{
		cout << "second类函数" << endl;
	}
};

int second::m_a = 20; 

void test()
{
	//1.通过对象访问
	second s;
	cout << s.first::m_a << endl;
	//2.通过类名访问(静态成员共用一个数据),可不建立对象,直接访问
	//第一个::代表通过类名访问,第二个::表示父类作用域下
	cout << second::first::m_a << endl;  //通过子类这个类名访问父类作用域中的属性
}

void test2()
{
	//1.通过对象访问
	second s;
	s.func();
	s.first::func();
	//2.通过类名访问
	second::first::func(100);
}

int main()
{
	//test();
	test2();
	system("pause");
	return 0;
}

6.多继承语法(不建议使用)

c++允许一个类继承多个类

语法:class 子类:继承方式 父类1,继承方式 父类2

多继承可能会有同名成员,需要前加作用域区分

7.菱形继承

概念:两个派生类继承同一个基类,同时某个类同时继承两个派生类,这种被称为菱形继承

用虚继承解决

class base
{
public:
	 int m_a;
};

//利用虚继承解决菱形继承的问题
//继承之前加上关键字virtual变成虚继承
//虚继承的数据类似共享,以最后的数据为准
class second1 :virtual public base{};
class second2 :virtual public base {};

class bottom :public second1, public second2{};

void test()
{
	bottom b;
	//当菱形继承时,两个派生父类有相同变量,需加上作用域来区分
	b.second1::m_a = 100; b.second2::m_a = 23;
	cout << "最后数据  " << b.m_a << endl;  //虚继承后最后一次把是数据修改成23
}

int main()
{
	test();
	system("pause");
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/754688.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号