多态与虚函数

学习c++的第九天

学习内容:

  1. 了解多态分类,理解静态联编和动态联编概念;
  2. 掌握运算符重载的方法;
  3. 理解类的派生中虚函数的作用;
  4. 掌握利用虚函数实现动态性的方法。
  5. ZZULI对教师每月工资的计算规定如下:固定工资+课时补贴;教授的固定工资为7000元,每个课时补贴50元;副教授的固定工资为5000元,每个课时补贴30元;讲师的固定工资为3000元,每个课时补贴20元。定义教师抽象类,派生出不同职称的教师类,编写程序求若干个教师的月工资。
    基本要求:
    (a) 题目解析及要求:
    a.1 基类Teacher中包含2个纯虚函数salary()和print(),分别用来为类提供计算月工资和显示相关信息的统一接口。将各派生类共有的“姓名”(name)和“课时”(lessons)属性也放在该类中。
    a.2 在各派生类中给出salary( )和print( )函数的具体实现,并调用基类Teacher的构造函数给name和lessons赋值。
    a.3 在主函数中运用赋值兼容规则。可以统一用基类指针指向各派生类对象,当对象较多时可循环处理,以动态联编的方式调用虚函数来实现多态。
    (b)测试数据:
    教授:姓名:Yifen 课时: 12
    副教授:姓名:Qikun 课时:16
    讲师:姓名:Yanhua 课时:20

遇到的问题:

  1. 静态联编、动态联编的概念;

  2. 类B创建对象b,类B继承类A时,对象b如何调用类A的构造函数。

解决的办法:

百度。百度。百度。

心得体会:

联编定义:
联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。在编译阶段就将函数实现和函数调用关联起来称之为静态联编,静态联编在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型。反之在程序执行的时候才进行这种关联称之为动态联编,动态联编对成员函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果。
C++中一般情况下联编也是静态联编,但是一旦涉及到多态性和虚函数就必须使用动态联编。多态性是面向对象的核心,它的最主要的思想就是可以采用多种形式的能力,通过一个用户名字或者用户接口完成不同的实现。通常多态性被简单的描述为"一个接口,多个实现。在C++里面具体的表现为通过基类指针访问派生类的函数和方法。

子类调用父类构造函数:


子类构造函数名(总参数列表):父类构造函数名(参数列表)
//总参数表:包括基类构造函数所需的参数和对派生类新增的数据成员初始化所需的参数.
//参数列表:参数表列中只有参数但无参数类型,因为在这里不是定义基类构造函数,
//而是调用基类构造函数,因此这些参数是实参而不是形参。
// 他们可以是常量、全局变量和派生类构造函数总参数表中的参数。

学习内容5的代码

#include<iostream>

using namespace std;

class Teacher {  //基类Teacher中包含2个纯虚函数salary()和print()
protected:			//分别用来为类提供计算月工资和显示相关信息的统一接口。
	string name;
	int course_t;

public:	
	Teacher(string nm, int cs) {  //调用基类Teacher的构造函数给name和course_t赋值
		name = nm;
		course_t = cs;
	}
	virtual void Salary() = 0;
	virtual void print() = 0;

};


class Lecturer :protected Teacher {  //讲师的固定工资为3000元,每个课时补贴20元。
private:
	int s;    
	
public:
	Lecturer(string nm, int cs) :Teacher("Yanhua", 20) {
	}//派生类构造函数名(总参数列表):基类构造函数名(参数列表)
	 void Salary() {  
		 
		 s = 3000 + course_t * 20;
		 print();
	}

	 void print() {
		 cout << "讲师" << name << "的工资为:" << s << "元" << endl;
	}
};


class Professor :protected Teacher {  //教授的固定工资为7000元,每个课时补贴50元;
private:
	int s;
	
public:
	Professor(string nm, int cs) :Teacher("Qikun", 16) {

	}
	void Salary() {

		s = 7000 + course_t * 50;
		print();
	}

	void print() {
		cout << "教授" << name << "的工资为:" << s << "元" << endl;
	}
};


class Asso_Professor :protected Teacher {  //副教授的固定工资为5000元,每个课时补贴30元;
private:
	int s;
	
public:
	Asso_Professor(string nm, int cs) :Teacher("Yifen", 12) {

	}
	void Salary() {

		s = 5000 + course_t * 30;
		print();
	}

	void print() {
		cout << "副教授" << name << "的工资为:" << s << "元" << endl;
	}
};


int main() {

	Lecturer l("Yanhua", 20);
	l.Salary();
	Professor p("Qikun", 16);
	p.Salary();
	Asso_Professor a("Yifen", 12);
	a.Salary();
	system("pause");
	return 0;
}

心得体会中,
“联编定义有借鉴:百度百科
“子类调用父类构造函数”有借鉴:如何调用父类的构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值