类和对象 多态 运算符重载
c 运算符的重载习题答案

1.概念填空题1.1运算符重载是对已有的运算符赋予多重含义,使同一个运算符在作用于不同类型对象时导致不同的行为。
运算符重载的实质是函数重载,是类的多态性特征。
1.2可以定义一种特殊的类型转换函数,将类的对象转换成基本数据类型的数据。
但是这种类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
类类型转换函数既没有参数,也不显式给出返回类型。
类类型函数中必须有return 表达式的语句返回函数值。
一个类可以定义多个类类型转换函数。
1.3运算符重载时其函数名由operator运算符构成。
成员函数重载双目运算符时,左操作数是对象,右操作数是函数参数。
2.简答题2.2简述运算符重载的规则。
2.2简述重载单目运算符++、--,前置和后置时的差别。
2.3 C++中重运算符是否都可以重载?是否都可以重载成类的成员函数?是否都可以重载成类的友元函数?2.4 构造函数作为类型转换函数的条件是什么。
3.选择题3.1在下列运算符中,不能重载的是(B)A.!B. sizeofC. newD. delete3.2 不能用友员函数重载的是(A)。
A.=B.==C.<=D.++3.3下列函数中,不能重载运算符的函数是(B)。
A.成员函数B.构造函数C.普通函数D.友员函数3.4如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(B)。
A.operator*(i.operator++(),k) B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))3.5已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是(B )。
A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变数据成员的值3.6在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。
C++随堂测试(继承、多态、重载)(答案)

{ int getn(){return B::n;} };
void main()
{ D d; d.B::n=10; d.C::n=20;
cout<<d.B::n<<","<<d.C::n<<endl;
}
A、10,20 B、20,20 C、10,10 D、输出有二义性,不确定
18、采用函数重载的目的在于:(D )
A、实现共享B、减少空间
C、提高速度D、使用方便,提高可读性
19.若类X和类Y的定义如下:
class X
{ int a,b;
public:
void fx ( );
};
class Y: public X
{ int c;
public:
void fy ( );
};
void Y::fy ( ) { c=a*b; }
}
答案:
基类带参构造Βιβλιοθήκη 数9派生类带参构造函数9派生类析构
基类析构
一、编程题
1.设向量X=(x1,x2,…,xn)和Y=(y1,y2…,yn),它们之间的加、减分别定义为:
X+Y=(x1+y1,x2+y2,…,xn+yn)
X-Y=(x1-y1,x2-y2,…,xn-yn)
编程序定义向量类Vector ,重载运算符”+”、”-“、”=”,实现向量之间的加、减和赋值运算;用重载运算符”>>”、”<<”做向量的输入/输出操作。注意检测运算的合法性。
A.成员函数 B.构造函数 C.普通函数 D.友元函数
C++基础系列——运算符重载

C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。
函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。
同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。
可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。
2024年C++面向对象程序设计教案(含多款)

C++面向对象程序设计教案(含多款)C++面向对象程序设计教案一、教学目标1.理解面向对象程序设计的基本概念,包括类、对象、继承、多态等。
2.掌握C++面向对象程序设计的基本语法和编程技巧。
3.能够运用面向对象的思想进行程序设计,解决实际问题。
二、教学内容1.面向对象程序设计的基本概念(1)类与对象类是对具有相同属性和行为的一组对象的抽象描述。
对象是类的实例,具有类定义的属性和行为。
(2)继承继承是面向对象程序设计的一个重要特性,用于表示类之间的层次关系。
子类可以继承父类的属性和行为,并在此基础上添加新的属性和行为。
(3)多态多态是指同一个操作作用于不同的对象时,可以有不同的解释和行为。
多态分为编译时多态和运行时多态。
2.C++面向对象程序设计的基本语法(1)类的定义与实现类定义包括类名、属性(成员变量)和方法(成员函数)。
类实现包括成员函数的定义。
(2)构造函数与析构函数构造函数用于创建对象时初始化成员变量,析构函数用于对象销毁时释放资源。
(3)继承与派生继承使用关键字class和public、protected、private访问限定符。
派生类可以添加新的成员变量和方法,也可以重写父类的方法。
(4)多态的实现多态可以通过虚函数、抽象类和接口实现。
虚函数使用关键字virtual声明,抽象类包含至少一个纯虚函数,接口是一种特殊的抽象类,只包含纯虚函数。
3.面向对象程序设计实例(1)设计一个简单的银行账户管理系统,包括账户类、储蓄账户类和信用卡账户类。
(2)设计一个图形类库,包括点、线、矩形和圆形等基本图形类。
三、教学方法1.讲授法:讲解面向对象程序设计的基本概念、语法和编程技巧。
2.案例分析法:通过分析实际案例,让学生理解面向对象程序设计的应用。
3.实践法:让学生动手编写代码,加深对面向对象程序设计的理解。
4.讨论法:组织学生讨论面向对象程序设计在实际项目中的应用。
四、教学评价1.课后作业:布置课后作业,检查学生对课堂知识的掌握程度。
C++_3_类与对象

第三章类与对象§3—1 面向对象§3—2 类的定义§3—3 对象的定义§3—4 对象的初始化§3—5 特殊类§3—6 特殊对象§3—7 特殊成员§3—8复杂对象§3—9 类类型转换§3—10 友元§3—1 面向对象一.面向对象面向对象本质上是一种自然合理的思维方法,是一种通过模仿人类建立现实世界模型的习惯思维方式和表达方式,运用对象、类、封装、继承、消息、多态性等概念来构造系统的软件开发方法,它包含面向对象的分析、设计、编程、测试和维护等过程。
它从研究的客观事物出发,将它们抽象为系统中的对象,作为构成系统的基本单位,并尽可能隐蔽对象的内部细节,再把具有相同属性和服务的对象抽象为类。
从客观事物出发,经过不同层次上的抽象得到基类和它的派生类,派生类继承基类的属性和服务,实现了共享。
类中的大多数数据只能用本类的方法进行处理,类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
向不同对象发送同一消息,可产生不同的行为二.面向对象的三大特性1.封装性:是基础是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节,只保留有限的对外接口使之与外部发生联系,其目的是有效地实现信息隐藏,它是软件设计模块化、软件复用、软件维护的基础对象和类是封装性的体现。
类是对若干对象的抽象描述,对象是它所属类的实例对象:是用来描述客观事物的一个实体,是问题域中客观事物的抽象表示,是用来构成系统的基本单位,由一组属性和行为构成对象属性:表示客观事物的静态特性,一般用数据表达对象行为:描述客观事物的动态特性,即事物的行为,一般用函数(方法)来表达类:是一种用户自定义的抽象数据类型,包含属性和服务两部分,它为该类的所有对象提供一种统一的抽象描述2.继承性:是关键派生类继承基类的属性和服务,派生类自身还有新的属性和服务继承机制既可避免公用代码的重复开发,减少代码和数据冗余,又可通过增强一致性来减少模块间的接口和界面继承有单继承和多继承,继承有传递性3.多态性:是补充即同一接口,多种方法;相同界面,多种实现指同一个名字对应着多种不同的行为或实现或不同对象收到相同的消息时,产生不同的行为多态性有两种:编译时的多态性:重载,包括函数和运算符重载运行时的多态性:动态联编,即同一属性或行为在基类及其各个派生类中具有不同的语义多态性使高层代码只写一次而在低层可多次复用,提高了程序设计的灵活性和效率三、基本术语1.抽象对一类具体事物共性的描述,即从一类事物中抽取共同的本质特点成为概念2.消息即成员函数的调用是向对象发出的服务请求,它包含提供服务的对象标识、服务标识以及输入信息和回答信息消息的接收者是提供服务的对象,它对外提供的每一种服务是按消息格式规定好的消息协议,该消息协议就是其服务的具体功能,即通过函数体来实现的一条完整的消息包含如下内容:①消息的接收者:对象标识②服务标识:函数名③符合消息协议要求的参数:函数实参表§3—2 类的定义一、类面向对象程序设计=对象+对象+对象对象=算法+数据结构类:是对某一类对象的抽象,它由概括了一组对象共同性质的数据和函数组成是一种用户自定义的抽象数据类型,它具有对数据的抽象性、隐藏性和封装性对象:是某一个类的实例,是对现实世界中真实对象的模拟现实世界是一个对象的世界,任何对象都具有一定的属性和操作,总能用数据结构与算法两者合一地来描述二、类的定义1.类的定义(1)说明部分用于类中成员作说明,告诉使用者“干什么”:①数据成员说明:对象的属性、状态、特征②成员函数说明:对象的行为、操作、服务、方法(2)实现部分用来实现成员函数,告诉使用者“怎么干”即提供成员函数的函数体2.具体定义格式:class 类名{public:成员函数和数据成员的说明或实现protected:成员函数和数据成员的说明或实现private:数据成员和成员函数的说明或实现};各个成员函数的实现说明:(1)类名:用户自定义的标识符,应有一定英文含义,类名本身就是类型名(2)类体:“{ }”括起来的部分,凡在其中实现的成员函数均为内联函数(3)访问权限修饰符:①public:公有访问属性,这种成员可以被任意函数访问(使用),提供类的接口功能②protected:保护访问属性,这种成员只能被本类的成员函数和友元函数以及派生类中的成员函数和友元函数访问(使用)③private:私有访问属性,这种成员只能被本类的成员函数和友元函数访问(使用)(4)当把私有成员的声明放于类体最前时,private可省略,即缺省(默认)访问权限为private(5)三种访问权限符在类体中的出现顺序可任意,也可出现多次或不出现(6)在类体中不允许对声明的数据成员进行初始化(7)在定义类的成员函数时,也可对形参设置默认值。
简述面向对象中的多态

简述面向对象中的多态
面向对象中的多态是指一个对象可以以多种形态存在。
简单来说,多态就是同一个方法可以有不同的实现方式。
在面向对象的程序设计中,多态是一种非常重要的概念。
它能够提高代码的灵活性和可扩展性,使得代码更易于维护和扩展。
多态的实现方式主要有两种:静态多态和动态多态。
静态多态是通过函数的重载和运算符的重载来实现的。
函数的重载是指在同一个类中定义多个同名函数,但这些函数具有不同的参数列表。
运算符的重载是指对于某个运算符,可以定义多个不同的操作方式。
在编译时,编译器会根据调用时的参数类型来确定具体调用的函数或运算符。
动态多态是通过继承和虚函数来实现的。
继承是指子类可以继承父类的属性和方法,通过定义一个指向父类对象的指针或引用,可以调用子类对象中重写的方法。
虚函数是在父类中声明为虚函数的函数,子类可以对其进行重写。
在运行时,根据实际对象的类型来调用相应的方法。
多态具有很多优点。
首先,它可以提高代码的重用性,一个类的方法可以被多个类继承并重写,这样可以减少代码的重复编写。
其次,多态可以使代码更加灵活,可以根据需要动态地根据对象的类型来调用相应的方法。
再次,多态可以提高代
码的可扩展性,当需要添加新的功能时,只需要在子类中重写相应的方法即可,而不需要修改已有的代码。
总之,多态是面向对象编程中非常重要的概念,通过使用多态可以使代码更灵活、可扩展和易于维护。
它是面向对象编程中的重要特性之一,值得我们深入理解和应用。
名词解释
函数重载:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。
类:具有相同属性和服务的一组对象的集合。
继承:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
虚基类:在虚继承体系中的通过virtual继承而来的基类,是一种派生方式。
多态性:多态性是指在一般类中定义的属性或者行为,被特殊类继承后,可以具有不同的数据类型或表现出不同的行为。
多态:指具有不同功能的函数可以用同一个函数名。
基类:已存在的用来派生新类的类为基类派生类:由已存在的类派生出的新类称为派生类异常处理:在设计程序时,充分考虑到各种意外情况,并给出恰当的处理。
流:数据之间的传输操作,是一种抽象,他负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
运算符重载:对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
友元:允许另一个类或函数访问你的类的东西。
抽象类:带有纯虚函数的类。
函数重载:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。
类:具有相同属性和服务的一组对象的集合。
继承:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
虚基类:在虚继承体系中的通过virtual继承而来的基类,是一种派生方式。
多态性:多态性是指在一般类中定义的属性或者行为,被特殊类继承后,可以具有不同的数据类型或表现出不同的行为。
多态:指具有不同功能的函数可以用同一个函数名。
基类:已存在的用来派生新类的类为基类派生类:由已存在的类派生出的新类称为派生类异常处理:在设计程序时,充分考虑到各种意外情况,并给出恰当的处理。
流:数据之间的传输操作,是一种抽象,他负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
运算符重载:对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
面向对象知识点归纳总结
面向对象知识点归纳总结一、面向对象的基本概念1、对象和类对象是现实世界中事物的抽象,在程序中则是指具有特定属性和行为的数据结构。
而类则是对象的蓝图,它定义了对象的属性和行为。
一个类可以实例化出多个对象,这些对象都具有相同的属性和行为。
2、封装封装是面向对象的概念之一,它指的是将数据和操作数据的方法封装在对象中,使对象对外部的访问受到限制。
这样可以保护数据的完整性,同时也可以隐藏对象的内部细节,对外部世界提供接口进行访问。
3、继承继承是面向对象的另一个基本概念,它指的是一个类可以从另一个类派生出来,并且具有被继承类的属性和方法。
继承可以实现代码的重用,同时也可以构建类的层次结构,方便管理和维护代码。
4、多态多态是指同一个方法在不同的对象上有不同的行为。
在面向对象的编程中,多态可以通过函数重载、运算符重载和虚函数等方式来实现。
这样可以提高代码的灵活性和可扩展性。
二、面向对象的三大特性1、封装如前所述,封装是将数据和操作数据的方法封装在对象中,对外部提供接口进行访问。
封装可以保护数据的完整性,同时也可以隐藏对象的内部细节。
2、继承继承是一种对象间的关系,它可以实现代码的重用并构建类的层次结构。
通过继承,子类可以继承父类的属性和方法,并且可以通过重写父类的方法来实现特定的行为。
3、多态多态是指同一个方法在不同的对象上有不同的行为。
多态可以通过函数重载、运算符重载和虚函数来实现。
多态可以提高代码的灵活性和可扩展性。
三、面向对象的设计原则1、单一职责原则(Single Responsibility Principle,简称SRP)单一职责原则指的是一个类只负责一个功能或者只作为一个职责。
这样可以使类的结构更加清晰,方便代码的维护和扩展。
2、开闭原则(Open Closed Principle,简称OCP)开闭原则指的是软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
这样可以使系统更加稳定和可扩展。
3、里氏替换原则(Liskov Substitution Principle,简称LSP)里氏替换原则指的是子类可以替换父类出现的任何地方,并且可以保证程序的行为不变。
第四章 运算符重载
4.3重载运算符的规则
(1)C++只允许已有的部分运算符实施重载。 (2)不能重载的运算符有五个。 (3)重载不改变操作数的个数。 (4)重载不改变运算符的优先级。 (5)运算符重载函数不能带默认值参数。 (6)运算符重载函数必须与自定义类型的对象联 合使用,其参数至少有一个类对象或类对象引用。 (7)C++默认提供 = 和 & 运算符重载。
例4.1 通过成员函数实现复数的加法。 class Complex { private: double real; double imag; public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex complex_add(Complex &c2); void display(); };
int main() {Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout<<"c1=";c1.display(); cout<<"c2=";c2.display(); cout<<"c1+c2=";c3.display(); return 0; }
说明: (1)用运算符重载函数取代了例 4.1中的加法成 员函数,从外观上看函数体和函数返回值都是相 同的。 (2)在主函数中的表达式c3=c2+c1 取代了例4.1 中的c3=plex_add(c2) ,编译系统将表达 式c3=c1+c2 解释为 c1.operator + ( c2 ) 对象c1调用的重载函数operator + ,以c2为实参 计算两个复数之和。
C++类的定义及其应用
《C++程序设计》——类的定义及使用准备知识:⑴命名空间(namespace)一个软件往往由多个模块组成,其中会包括由不同程序员开发的组件以及类库提供的组件,因此,在对标识符命名时有可能发生冲突。
一个命名空间将不同的标识符集合在一个命名的作用域内,以防止命名冲突。
比如以如下形式声明一个命名空间s:namespace s{class A{ };void fun();}则引用标识符的方式如下:s::A a;s::fun();即在标识符前加命名空间名称及“::”的前缀。
E1_1如果使用声明:using namespace <已命名的命名空间名称>;比如:using namespace s;该命令用来打开命名空间的限制,则该命名空间中所有的标识符在当前作用域中都可以直接使用,不需要任何前缀。
E1_2在C++标准程序库中,使用了命名空间std,所有标识符都声明在命名空间std中。
在使用C++标准程序库中的任何标识符时,可以直接指定标识符所属的命名空间,例如:std::cout,也可以使用using命令来打开命名空间的限制。
C++标准程序库中中的头文件不再有“.h”的扩展名,因此,在程序开始处使用#include<iostream>、#include<cstdio>、#include<cstring>等包含命令时,可以使用using namespace std;命令打开命名空间的限制。
E1_3在Visual C++ 6.0编译环境中要使用一系列的I/O流类,就应该包含头文件iostream。
⑵对象:现实世界中的一切事物都是对象,对象可以是有形的,比如一间房间,一本书籍;也可以是无形的,比如一个计划。
对象可以是一个简单的个体,比如一个学生;也可以是由其它对象组合而成,比如一个公司有多个部门,每个部门又由许多员工组成。
对类似的对象进行抽象,找出共同的属性就可以构成一种类形。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
返回
6
关于虚函数的注意事项:
• 只能用virtual声明类的成员函数,使它成为虚函数, 而不能将类外的普通函数声明为虚函数 • 一个成员函数被声明成虚函数以后,同一类族中不能 再定义一个非virtual的但与该虚函数具有相同参数 (包括个数和类型)和函数返回值类型的同名函数。 • 虚函数的函数体可以是空的,具体的功能由派生类添 加。
返回
16
void main() { Shape *p; Triangle t; Rectangle r; p=&t; p->set(5.1,10); p->area(); p=&r; p->set(5.1,10); p->area(); }
返回
17
应用举例
例12-4
返回
18
上机题
应用抽象类,求圆、圆内接正方形和圆外切正方 形的面积和周长。 提示: 定义一个抽象类shape,在其中定义纯虚函数area ()和perimeter()
返回
7
在什么情况下声明虚函数
• 成员函数所在的类是否为基类,且在其派生类 中是否希望被更改功能 • 是否通过基类指针或引用去访问。
返回
8
虚函数与重载函数的比较
(1)重载函数要求函数有相同的函数名称,并有不同的 参数序列;而虚函数则要求这三项(函数名、返回值 类型和参数序列)完全相同; (2)重载函数可以是成员函数或友员函数,而虚函数只 能是成员函数; (3)重载函数的调用是以所传递参数序列的差别作为调 用不同函数的依据;虚函数是根据对象的不同去调用 不同类的虚函数; (4)虚函数在运行时表现出多态功能,这是C++的精髓; 而重载函数则在编译时表现出多态性。
十二章 多态性与虚函数
12.1 多态性 学生 教师
消息:调用函数
新学期开学
方法:函数
家长
后勤人员
多态性就是向不同的对象发送同一个消息,不同的对象 在接收时会产生不同的行为(方法)。或者说,每个对象 可以用自己的方式去响应共同的消息。 返回
1
两种多态性
编译时的多态:静态多态性 运行时的多态:动态多态性
返回
9
虚析构函数
当撤消派生类的对象时,先调用派生类析构函数, 然后自动调用基类析构函数,如此看来析构函数没 必要定义为虚函数。但是,假如使用基类指针指向 其派生类的对象,而这个派生类对象是用new运算创 建的。当程序使用delete运算撤消派生类对象时,结 果会如何呢?
一个简单的例题:例12-3
返回
例12-2
返回
4
虚函数
virtual <类型说明符 ><函数名>(<参数表>) 即在类的说明中,在函数原型之前加virtual。 注意: • virtual 只用在类定义的原型说明中,不能用在函数实 现中。 • 具有继承性,基类中定义了虚函数,派生类中无义。 • 调用方式:通过基类指针或引用,执行时会根据指针 指向的对象的类,决定调用哪个函数。
返回
5
静态关联与动态关联
关联(联编)的含义是指把一个消息和一个方法联系在 一起,也就是把一个函数名与其实现代码联系在一起
静态关联:在编译时即可确定其调用的虚函数 属于哪一个类,其过程称为静态关联,或者称 为早期关联。 动态关联:在运行阶段把虚函数和类对象 绑定在一起,其过程称为动态关联,或者 称为滞后关联
15
class Triangle: public Shape { public: void area() { cout<< "三角形面积: " <<0.5*x*y<<endl; } }; class Rectangle: public Shape { public: void area() { cout<<"矩形面积:" <<x*y<<endl; } };
返回
13
抽象类
声明了纯虚函数的类,称为抽象类。 使用纯虚函数时应注意: (1)抽象类中可以有多个纯虚函数。 (2)不能声明抽象类的对象,但可以声明指向抽象类 的指针变量和引用变量。 (3)抽象类也可以定义其他非纯虚函数。 (4)如果派生类中没有重新定义基类中的纯虚函数,则在派生类中 必须再将该虚函数声明为纯虚函数。 (5)从抽象类可以派生出具体或抽象类,但不能从具体类派生出抽 象类。 (6)在一个复杂的类继承结构中,越上层的类抽象程度越高,有时 甚至无法给出某些成员函数的实现,显然,抽象类是一种特殊的 类,它一般处于类继承结构的较外层。 (7)引入抽象类的目的,主要是为了能将相关类组织在一个类继承 结构中,并通过抽象类来为这些相关类提供统一的操作接口。
返回
14
应用举例
例1. 设计一个抽象类shape,它表示具有形状的东西, 体现了抽象的概念,在它下面可以派生出多种具体形 状,比如三角形、矩形。 #include<iostream.h> class Shape { protected: double x,y; public: void set(double i, double j) { x=i; y=j; } virtual void area()=0; //声明纯虚函数 }; 返回
cy.Circle::area( ) 调用基类Circle中的成员函数() 能否采用同一调用形式,既能调用基类又能调用派生 类的同名函数?
返回
3
虚函数
虚函数的作用是允许在派生类中重新定义与基类同名的 函数,并且可以通过基类指针或引用来访问基类和派生 类中的同名函数。
程序中不是通过不同的对象名去调用不同派生层次中 的同名函数,而是通过指针调用它们。
返回
19
不能!因为在执行构造函数时类对象还未完成建立 过程,当然谈不上函数与类对象的绑定。 返回
12
纯虚函数
纯虚函数是在基类中只声明虚函数而不给出具体的 函数定义体,将它的具体定义放在各派生类中,称此 虚函数为纯虚函数。通过该基类的指针或引用就可以 调用所有派生类的虚函数,基类只是用于继承,仅作 为一个接口,具体功能在派生类中实现。 纯虚函数的声明如下: virtual 函数原型=0; 其中:函数原型的格式同前面所学格式一样,要包括 函数返回值的类型、函数名、圆括号、形参及其类型 等
在程序编译的时候就能 决定调用的是哪一个函 数,因此也称为静态多态性
在程序运行的过程中动态 的确定操作所针对的对象, 因此也称为动态多态性
运算符重载和函数重载
虚函数
例12-1
返回
2
虚函数
同一个类中,不能定义两个名字相同、参数个数和类型都相 同的函数,否则是重复定义。 在类的继承层次结构中,不同的层次中可以出现名字相同,参 数个数和类型都相同的功能不同的函数。 cy.area( ) 调用派生类的成员函数area( )
10
这时只调用了基类的析构函数,而没有调用派 生类的析构函数。 如果使用虚析构函数,无论指针所指的对象是 基类对象还是派生类对象,程序执行时都会调用对 应的析构函数。
返回
11
虚析构函数的应用场合:
主要用于:如果用new运算符建立了临时对象,若 基类中有析构函数,并且定义了一个指向该基类 的指针变量。在程序用带指针参数的delete运算 符撤销对象时,会发生一个情况: 系统会只执行 基类的析构函数,而不执行派生类的析构函数。 原因:p是指向基类的指针变量,指向new开辟的 动态存储空间,detele释放该空间。 构造函数能声明为虚函数吗?