c++特别要点:多态性与虚函数】的更多相关文章

6-2 多态性与虚函数 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1000ms Memory Limit 65536K java.python2.python3.ruby.perl Time Limit2000ms Memory Limit 131072K" style="padding:0px; margin:0px; color:rgb(83,113,197); text-decorati…
本来是准备在工厂模式中顺便整理.但粗略浏览了,内容还是很多,需要单独开一篇. 一.什么是多态性? 多态性可以概括为“一个接口,多种方法”. 多态与非多态的区别在于“成员函数调用地址的早绑定和晚绑定”.“早绑定”在编译期就可以确定函数的调用地址,是静态的:“晚绑定”在运行时才能确定函数的调用地址,是动态的. 多态的作用是什么呢?在面向对象的编程中,“封装”使得代码模块化:“继承”可以扩展以存在的代码:“多态”使得接口重用. 二.多态性的c++实现:虚函数 声明基类的指针,该指针指向子类的对象.调用…
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 1    纯虚函数 在前面的博客中已经提到:有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义.举个小例子:如果定义基类Point,在基类中是不需要求面积的area函数的,因为“点”是没有面积的.但是在其直接派生类Circle和间接派生类Cylinder中都需要ar…
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义,多态性就是一个事物具有多种形态.在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为.也就是说,每个对象可以用自己的方式去响应共同的消息,所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数.在C++中,多态性表现形式之一是:具有不同功能的函…
面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了"一个接口,多种方法". 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前…
多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函数名对应着不同的实现: 函数重载的条件是要求函数参数的类型或个数有所不同.对成员函数的重载有以下的三种表达方式 在一个类中重载 在不同类中重载 基类的成员函数在派生类里面重载: 另外,如果是继承类中,子类与父类的成员函数同名的情况称为重定义: 当我们想要指定哪个类的成员函数需要指定是哪个类,使用格式…
2017-06-27 19:17:52 C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助. 一.多态的作用: 隐藏实现细节,使得代码能够模块化: 接口重用,实现“一个接口,多种方法”: 二.虚函数的声明: class Base { virtual 返回值类型 函数名(形参表){} } 当基类的某个成员函数被声明为虚函数后,其子类中的函数如果返回值类型,函数名,形参表一致的话,不论是否加了virtual关键字,都会被认为是虚函数.反之,则是同名隐藏. virtual…
面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介…
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 阅读程序1.阅读.改动和执行关于交通工具类的程序,回答问题,以理解相关技术方法(1)请写出程序的执行结果,并在上机时对比理解 #include <iostream> using namespace std; class Vehicle //交通工具 { public: void run() const { cout <<…
多态性给我们带来了好处:多态使得我们可以通过基类的引用或指针来指明一个对象(包含其派生类的对象),当调用函数时可以自动判断调用的是哪个对象的函数. 一个函数说明为虚函数,表明在继承的类中重载这个函数时,当调用这个函数时应当查看以确定调用哪个对象的这个函数. 普通函数的处理:一个特定的函数都会映射到特定的代码,无论时编译阶段还是连接阶段,编译器都能计算出这个函数的地址,调用即可. 虚函数的处理:被调用的函数不仅依据调用的特定函数,还依据调用的对象的种类.通常是由虚函数表(vtable)来实现的.…
多态性 多态性是面向对象程序设计的关键技术之一.若程序设计语言不支持多态性,不能称为面向对象的语言.利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能. 多态性(polymorphism)多态性是考虑在不同层次的类中,以及在同一类中,同名的成员函数之间的关系问题.函数的重载,运算符的重载,属于编译时的多态性.以虚基类为基础的运行时的多态性是面向对象程序设计的标志性特征.体现了类推和比喻的思想方法. 虚函数 虚函数是一个类的成员函数,定义格式如下:virtual 返回类型  函数名(参…
派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”.面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编. (一)多态性 多态是指同样的消息被不同的对象接收时导致不同的行为.所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现,也就是调用了不同的函数. 1)多态的分类 广义上说,多态性是指一段程序能够处理多种类型对象的能力.在C++中,这种多态性可以通过重载多态(函数和运算符…
本篇要学习的内容和知识结构概览 多态性 编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数. 运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持. 静态联编中的赋值兼容性及名字支配规律 派生一个类的原因并非总是为了添加新的成员或成员函数, 有时是为了重新定义基类的成员函数. #define PI 3.14159 class Point { double x; double y; public: Point(double a, double…
例8.1 分析下面程序的输出结果. 例8.2 分别使用指针和引用的display函数. #include <iostream> using namespace std; const double PI = 3.14159; class Point { private: double x, y; public: Point(double i, double j) { x = i; y = j; } virtual double area() { ; } }; class Circle :publ…
原文出处:http://my.oschina.net/hnuweiwei/blog/280894 目录[-] 多态 虚函数 纯虚函数 虚表 一般继承(无虚函数覆盖) 一般继承(有虚函数覆盖) 多重继承(无虚函数覆盖) 多重继承(有虚函数覆盖) 多态 多态性就是指同样的消息被类的不同的对象接收时导致的完全不同的行为的一种现象.这里所说的消息即对类成员函数的调用.多态实质是一个函数名称的多种形态. C++支持两种不同类型的多态:一种是编译时的多态,另一种是运行时的多态.在编译时的多态是通过静态联编实…
纯虚函数就是一个在基类中的虚函数,差别只是在一般的虚函数声明的后面加了"=0",虚函数允许函数通过与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,称为运行时的多态性,虚函数是可以有具体实现代码的.那么,为什么要有纯虚函数?在基类中的函数只有说明而没有具体定义的时候,不执行有意义的操作,也没有具体去实现代码,于是在派生类中就可以实现具体的操作,无论是单继承也好,还是多继承也好,重新定义这个在基类声明的函数,这个函数的实现可以根据需求去实现,咱们来看一个例子: #inclu…
1)C++利用虚函数来实现多态. 程序执行时的多态性通过虚函数体现,实现运行时多态性的机制称爲动态绑定:与编译时的多态性(通过函数重载.运算符重载体现,称爲静态绑定)相对应. 在成员函数的声明前加上virtual修饰,派生类可以不加virtual修饰,则声明之为虚函数.在派生类中可以重新定义从基类继承下来的虚函数.下面是一个例子,Rectangle是Shape的派生类,在类Rectangle中对Shape中的虚函数Draw()进行了重新定义: class Shape { public: virt…
多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. 运行时多态性:不同对象在收到相同消息时产生不同的动作,一般通过虚函数来实现,只有在运行时才能实现绑定,属于动态绑定. 虚函数 虚函数是在基类中用关键字virtual 标识的成员函数,可以在一个或多个派生类中被重新定义.如果一个函数被定义为虚函数,那么,即使是使用指向基类对象的指针来调用该成员函数,也…
http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何构造函数,那么C++编译器就会在某种情况下为该类提供一个默认的不带参数的构造函数. 只要一个类中定义了一个构造函数,不管这个构造函数是不是默认的,C++编译器都不会再提供默认的构造函数,所以,如果定义了自己的构造函数还想调用默认的构造函数的话,必须再重新定义一个默认的构造函数. 2)析构函数不允许带…
1.直接看下列代码: #include <iostream> using namespace std; class base{ public: void who(){ cout<<"this is the class of base!"<<endl; } }; class derivel1:public base{ public: void who(){ //一般的重载函数 cout<<"this is the class of…
http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/11/2134673.html 多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作. C++支持两种多态性:编译时多态性,运行时多态性. a. 编译时多态性:通过重载函数和运算符重载实现. b. 运行时多态性:通过虚函数和继承实现.   虚函数 虚函数是在基类中被声明为virtual的函数.为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类…
一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类.子类中的同名函数的话,这个函数是有要求的: 在父类中,eat函数声明之前必须要加virtual声明eat()函数为虚函数. 一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是虚函数. 为了避免你在子类中写错虚函数,在C++11中,你可以在函数…
目录 静态类型 vs 动态类型.静态绑定 vs 动态绑定 虚函数动态绑定实现机制.虚析构函数 多态性 一.静态 vs 动态 静态类型 VS 动态类型.静态类型指的是对象声明的类型,在编译器确定的.动态类型指的是对象的所指向的类型,动态类型是可以更改的,静态类型无法更改.继承关系会导致对象的指针和引用具有静态类型和动态类型,因为继承关系的存在中可能会存在类型之间的向上向下类型转换.静态绑定 VS 动态绑定.某特性(函数)依赖与对象的静态类型,在编译期确定,某特性(函数)依赖于对象的动态类型,在运行…
十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧.…
一.多态性 ①概述:多态是指同样的消息被不同类型的对象接收时导致的不同行为. ②类型: 可以分为四类:重载多态.强制多态.包含多态.参数多态. ------------------------ ---------------------------           专用多态 通用多态 ③实现: 从实现角度可以划分为两类:编译时多态和运行时多态. 绑定:就是把一条消息和一个对象的方法结合的过程. 静态多态:在编译过程中确定了同名操作的具体对象.绑定工作在编译连接阶段完成的情况(实现手段:函数/…
class Class1 { public: virtual void f() { cout << "Function f() in Class1 \n"; } void g() { cout << "Function g() in Class1 \n"; } }; class Class2 { public: virtual void f() { cout << "Function f() in Class2\n&qu…
1.      虚函数能否定义为模板函数 当一个类有虚函数时,它一定有一个虚表,用来纪录每个虚函数的实际地址.这也就是说这个虚表的大小是在编译期就确定了的.有多少个虚函数,虚表就纪录几个.        类中的模板函数函数会根据具体的类型而实例化,这也就是说这个模板函数会实例多少个函数出来是不知道的,这样,虚表的大小就不好确定了.所以在现有的编译器的情况下,虚函数不能是模板函数.当然以后可能会支持这种情况. 2.      虚函数能否定义为static类型 不能.成员函数不可同时为virtual…
在用基类指针指向派生类时, 在基类析构函数声明为virtual的时候,delete基类指针,会先调用派生类的析构函数,再调用基类的析构函数. 在基类析构函数没有声明为virtual的时候,delete基类指针,只会调用基类的析构函数,而不会调用派生类的析构函数,这样会造成销毁对象的不完全. class A { public: ~A() { cout<<"A destruct"< }; class AA : public A { public: ~AA() { cout…
虚函数与纯虚函数的区别: 1.拥有虚函数的类可以声明对象,但拥有纯虚函数的类不可以声明对象(只能声明一个指针,并且不能给其分配内存),并且将这个类称为抽象类 特点: 1.虚函数是动态绑定的基础. 2.是非静态的成员函数. 在类的声明中,在函数原型之前写virtual.(不能声明为静态函数) 3.virtual 只用来说明类声明中的原型,不能用在函数实现时. 4.具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数. 5.本质:不是重载声明而是覆盖. 6.调用方式:通过基…
以下两段程序的输出是什么? 程序1: #include "stdio.h" class Base { public: int Bar(char x) { return (int)(x); } virtual int Bar(int x) { return (2 * x); } }; class Derived : public Base { public: int Bar(char x) { return (int)(-x); } int Bar(int x) { return (x…