c++复习笔记--多态

多态

1 概念

面向对象系统的多态性是指不同的对象收到相同的的消息时, 执行不同的操作

编译时的多态性

多态性

运行时的多态性

编译时多态性主要是通过函数重载和运算符重载实现的。

运行时多态性主要是通过虚函数来实现的。

在C++中规定: 基类的对象指针可以指向它的公有派生的对象,但是当其指向公有派生类对象时,

它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员

例如

#include<iostream.h>    //例6.1-1 虚函数引例

class base {

int a,b;

public:

base(int x,int y) { a=x;  b=y; }

void show( )

{ cout<<"调用基类base的show函数\n";

cout<<"a=" <<a<<“b="<<b<<endl; }   };

class dirive:public base {

int c;

public:

dirive(int x,int y,int z):base(x,y){c=z;}

void show( ) { cout<< "调用派生类dirive的show函数\n";

cout<<"c="<<c<<endl; }  };

void main( )

{ base  mb(50,50),  *mp; dirive  mc(10,20,30);

mp=&mb;  mp->show( );

mp=&mc;  mp->show( ); }

运行结果是

调用基类base的show函数

a=50  b=50

调用基类base的show函数

a=10  b=20

2 虚函数

1)虚函数的作用和定义

1.虚函数的作用

虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数

例如

#include<iostream.h>   //例5.2-1

class base {

int a,b;

public:

base(int x,int y) { a=x; b=y; }

virtual void show( ) {cout<<"调用基类base的show函数\n";//

在基类中,show()定义为虚函数

cout<<"a=" <<a<<"b="<<b<<endl; }  };

class dirive: public base {

int c;

public: dirive(int x,int y,int z):base(x,y){  c=z; }

void show( ) { cout<< "调用派生类dirive的show函数\n";   cout<<"c="<<c<<endl; }

};//

在派生类中,重新定义虚函数show()

void main( )

{ base mb(50,50), *mp;

dirive mc(10,20,30);//

调用基类base的show()函数

mp=&mb; mp->show();  //

mp=&mc; mp->show()//

调用派生类dirive的show()函数

;}

3虚析构函数

#include<iostream>   //例6.6-1 虚析构函数的使用。

using namespace std;

class B{

public:

virtual ~B()

{ cout<<"调用基类B的析构函数\n";}

};

class D:public B{

public:

~D()

{ cout<<"调用派生类D的析构函数\n";}

};

int main()

{ B *p;           //定义指向基类B的指针变量p

p= new D;

delete p;

return 0; }

1 将基类的析构函数声明为虚析构函数

2 使用了虚析构函数, 程序执行了动态联编,实现了运行的多态性

(1) 虚析构函数没有类型,也没有参数。

(2) 如果将基类的析构函数定义为虚函数,由该基类所派生的所有派生类的析构函数也都自动成为虚函数。

(3)在C++中,不能声明虚构造函数,但是可以声明虚析构函数。

4 纯虚函数和抽象类

1 基类本身并不需要这个虚函数,而是为派生类提供一个公共接口,以便派生类根据需要重新定义虚函数

2

纯虚函数的特点:

① 纯虚函数没有函数体;

② 最后面的“=0”并不表示函数的返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;

③ 纯虚函数不具备函数的功能,不能被调用

例子:

#include<iostream.h>

class Circle {

protected:

int r;

public:

void setr(int x){ r=x; }

virtual void show( )=0;

};

class Area:public Circle{

public:

void show( )

{ cout<<"这个圆的面积是:"<<3.14*r*r<<endl;} };

class Perimeter:public Circle{

public:

void show( )

{ cout<<"这个圆的周长是: "<<2*3.14*r<<endl;} };

void main( )

{ Circle  *ptr;

Area ob1;

Perimeter ob2;

ob1.setr(10);

ob2.setr(10);

ptr=&ob1; ptr->show();

ptr=&ob2; ptr->show(); }

5 抽象类

1 作用     抽象类的作用是作为一个类族的共同基类,相关的派生类是从这个基类派生出来的

2 使用抽象类的几点规定

(1) 由于抽象类中至少包含有一个没有定义功能的纯虚函数,

因此抽象类只能用作其他类的基类,不能建立抽象类对象。

(2) 不允许从具体类派生出抽象类。所谓具体类,就是不包含纯虚函数的普通类;

(3) 抽象类不能用作函数的参数类型、函数的返回类型或显式转换的类型;

(4) 可以声明指向抽象类的指针或引用,此指针可以指向它的派生类,进而实现多态性。

(5) 在派生类中,如果对基类的纯虚函数没有重新定义,则该函数在派生类中仍是纯虚函数,该派生类仍为抽象类。

例如:

#include<iostream>

using namespace std;

class Figure{

protected:

double r;

public:

Figure(double x){ r=x; }

virtual void area()=0;       //纯虚函数

virtual void perimeter()=0;  //纯虚函数

};

class Circle:public Figure{

public:

Circle(double x):Figure(x){  }

void area()

{ cout<<"圆的面积是"<<3.14*r*r<<endl;  }

void perimeter( )

{ cout<<"圆的周长是";

cout<<2*3.14*r<<endl; }

};

class In_square:public Figure{

public:

In_square(double x):Figure(x){ }

void area()

{ cout<<" 圆内接正方形的面积是";

cout<<2*r*r<<endl;}

void perimeter( )

{ cout<<"圆内接正方形的周长是";

cout<<4*1.414*r<<endl; }

};

class Ex_square:public Figure{

public:

Ex_square(double x):Figure(x){ }

void area()

{ cout<<" 圆外切正方形的面积是";

cout<<4*r*r<<endl;}

void perimeter( )

{ cout<<"圆外切正方形的周长是";

cout<<8*r <<endl; }

};

int main()

{

Figure *ptr;      //定义抽象类Figure的指针ptr

Circle ob1(5);    //定义类Circle的对象ob1

In_square ob2(5); //定义类In_square的对象ob2

Ex_square ob3(5); //定义类Ex_square的对象ob3

ptr=&ob1; ptr->area(); //求圆的面积

ptr->perimeter();      //求圆的周长

ptr=&ob2; ptr->area(); //求圆内接正方形的面积

ptr->perimeter();      //求圆内接正方形的周长

ptr=&ob3; ptr->area(); //求圆外切正方形的面积

ptr->perimeter();      //求圆外切正方形的周长

return 0;  }

时间: 2024-10-10 10:03:36

c++复习笔记--多态的相关文章

2014年软考程序员-常考知识点复习笔记【第一章】

51CTO学院,在软考备考季特别整理了"2014年软考程序员-常考知识点复习笔记[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考程序员-常考知识点复习笔记[汇总篇]  常考基础知识必会 A. 排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法; B. 查找:哈希查找.二叉树查找.折半查找的对比,哈希映射和哈希表的区别? C. 链表和数组的区别,在什么情况下用链表什么情况下用数组? D. 栈和队列的区

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面

计算机图形学 复习笔记

计算机图形学 复习笔记 (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341) 第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象的客观对象 包括自然景物.拍摄到的图片.用数学方法描述的图形等等 图形的要素 几何要素:刻画对象的轮廓.形状等 非几何要素:刻画对象的颜色.材质等 图形表示法 点阵表示 枚举出图形中所有的点,简称为图像. 参数表示 由图形的

安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)

什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Activity中,我们可以合并多个Fragment在一个单独的activity中建立多个UI面板,或

安卓开发复习笔记——WebView组件

我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebView? WebView(网络视图)能加载显示网页,可以将其视为一个浏览器,它使用了WebKit渲染引擎加载显示网页. 废话不多说,直接上代码 1.需要在xml布局文件中声明WebView组件 1 <WebView 2 android:id="@+id/webview" 3 androi

[Java基础] Java线程复习笔记

先说说线程和进程,现代操作系统几乎无一例外地采用进程的概念,进程之间基本上可以认为是相互独立的,共享的资源非常少.线程可以认为是轻量级的进 程,充分地利用线程可以使得同一个进程中执行多种任务.Java是第一个在语言层面就支持线程操作的主流编程语言.和进程类似,线程也是各自独立的,有自 己的栈,自己的局部变量,自己的程序执行并行路径,但线程的独立性又没有进程那么强,它们共享内存,文件资源,以及其他进程层面的状态等.同一个进程内的 多个线程共享同样的内存空间,这也就意味着这些线程可以访问同样的变量和

oracle从入门到精通复习笔记续集之PL/SQL(轻量版)

复习内容: PL/SQL的基本语法.记录类型.流程控制.游标的使用. 异常处理机制.存储函数/存储过程.触发器. 为方便大家跟着我的笔记练习,为此提供数据库表文件给大家下载:点我下载 为了要有输出的结果,在写PL/SQL程序前都在先运行这一句:set serveroutput on结构:declare--声明变量.类型.游标begin--程序的执行部分(类似于java里的main()方法)exception--针对begin块中出现的异常,提供处理的机制--when...then...--whe

IOS开发复习笔记(3)-ARC

1.ARC 当你自己调用了release或retain语句的时候,ARC有效时编译文件会遇到错误,你可以通过-fno-objc-arc和-fobjc-arc两个编译器标志在混搭中支持ARC和非ARC的代码 如下面编译支持ARC,而文件代码不支持ARC # if !__has_feature(objc_arc) //this code do not support to ARC -(void) release{ //release your var } #endif 在ARC工程中集成非ARC的第

数据库系统概论 复习笔记。

大学课本复习笔记,知识点总结. 2012-08-15 数据模型中的 型,Type, 学号,姓名.... 值,Value, 0001, Ender..... 数据库系统的三级模式,两级映射, 外模式,External Schema/Sub Schema, 是用户能看得到的直接使用的.一个数据库有多个外模式,应用于用户的不同需求.但每个应用程序只能使用一个外模式.保证安全.每个用户只能访问对应的外模式. 模式,Schema, 是数据库中全体数据的逻辑结构和特征的描述,只涉及 型Type的描述.模式的