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

C++——实验二继承和多态

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

C++——实验二继承和多态

一、继承访问权限测试
设计类A具有public, protected, private等不同属性的成员函数或变量;
类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;
在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;
B以private方式继承A,尝试把A中的部分public成员提升为public。
二、友元类继承测试
设计类A含有私有变量a,在类A中友元给类C;
设计类B继承A,添加私有变量b;在类C中测试访问类B的成员变量a, b;
设计类D继承C,在D的成员函数中测试访问类A的成员变量a,类B的成员变量a, b。
三、多态性综合运用
一般多态性函数:输入输出参数完全一样,在父类中添加virtual;
特殊多态性函数:输入或输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用;
析构函数的多态性;
多继承,注意什么情况需要虚继承;
二、实验过程
设计类A具有public, protected, private等不同属性的成员函数或变量;

class A
{
private:
	int pri_a;
protected:
	int pro_a;
public:
	A();
	int pub_a;
	friend class C;
	virtual void name() {
		cout << "i am A" << endl;
	}
};

类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;

//公共继承
class B1:public A{
public:
	void fun1(){
	
		pub_a;//可以访问public 权限为public
		pro_a;//可以访问protected  权限为protected
		//pri_a;// 不能访问父类的private
		
	}
	
};

//保护继承
class B2:protected A{
public:
	void fun2(){
		pub_a;//可以访问public 权限为protected
		pro_a;//可以访问protected  权限为protected
		//pri_a;//不能访问父类的private
	}
};

//私有继承
class B3:private A{
public:
	void fun3(){
		pub_a;//可以访问public 权限为private
		pro_a;//可以访问protected 权限为private
		//pri_a;//不能访问父类的private
	}
};

在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;

B a;
cout << a.pub_a << endl;//在外部访问B的各个成员;pub_a可以访问到
	//cout << a.pri_a<

B以private方式继承A,尝试把A中的部分public成员提升为public。

class B3 :private A
{
public:
	using A::pub_a;//在B3中提升A的public成员为public
	void call() { //测试A中成员
		//pri_a = 1; error 
		pro_a = 2;
		pub_a = 3;
	}
};

友元类继承测试

#include
using namespace std;
class A
{
	private: 
		int a=100;
		friend class C;
};
class B :public A
{
	private:
		int b=10;
};
class C
{
	public:
		void test()
		{
			B b1;
			b1.a;
			//b1.b不可访问
		}
};
class D :public C
{
	public:
		void test()
		{
			A a1;
			//a1.a;不可访问
			B b1;
			//b1.a;不可访问
			//b1.b;不可访问
		}
};

一般多态性函数:输入输出参数完全一样,在父类中添加virtual

class Animal {
public:
	int m_Age=0;
public:
	virtual void speak() {
		cout << "动物在说话" << endl;
	}
};

class Sheep :public Animal{
public:
	void speak() {
		cout << "羊在说话" << endl;
	}
};

class Camel :public Animal{
public:
	void speak() {
		cout << "骆驼在说话" << endl;
	}
};

三、总结
1、虚函数

  • 用virtual关键字说明的函数
  • 虚函数是实现运行时多态性基础
  • C++中的虚函数是动态绑定的函数
  • 虚函数必须是非静态的成员函数,虚函数经过派生之后,就可以实现运行过程中的多态。

2、多继承,注意什么情况需要虚继承;
多继承
派生类有多个基类继承而来叫做多继承,其构造时按照基类在派生类中的声明顺序依次进行,由于派生类有多个基类派生而来,所以可能出现命名冲突,出现冲突时使用::指明到底使用的是哪个类的成员。c由AB派生而来,其内存模型如上图所示。

虚继承(菱形继承)
类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A–>B–>D 这条路径,另一份来自 A–>C–>D 这条路径。当需要访问A的成员变量时,就会产二义性。

虚继承时构造函数的执行顺序与普通继承时不同:在最终派生类的构造函数调用列表中,不管各个构造函数出现的顺序如何,编译器总是先调用虚基类的构造函数,再按照出现的顺序调用其他的构造函数;而对于普通继承,就是按照构造函数出现的顺序依次调用的。

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

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

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