虚函数

C++多态性总结

放肆的年华 提交于 2019-12-02 11:30:01
一,C++多态性概述 多态是指同样的消息被不同类型的对象接受时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就调用不同的函数。换言之,多态指的就是用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。 二,多态性分类 面向对象的多态性可以分为4类:重载多态,强制多态,包含多态,参数多态。前面两种统称专用多态,后面两种统称通用多态。 三,各种多态举例说明 1,重载多态: 重载多态包括前面学过的普通函数及类的成员函数的重载还有运算符的重载。 普通函数重载举例: int add(int x, int y) { return x + y; } double add(double x, double y) { return x + y; } float add(float x, float y) { return x + y; } 类的成员函数相当于函数在类的内部实现重载,在这儿就不详细说明了,跟普通函数重载大同小异。 下面重点介绍运算符号重载: 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同的行为。 运算符重载可以分为重载为成员函数以及重载为非成员函数两种。 重载为成员函数: 其一般语法形式为: 返回类型 operator 运算符(形参表) { 函数体 } 例1:(单目运算符)实现复数类前置++,后置+

虚函数以及纯虚函数

天涯浪子 提交于 2019-12-02 11:27:30
   多态性 是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。   虚函数和纯虚函数都是实现多态的重要方法。本文就这两种方法进行分析以及比较 1、虚函数 在基类中声明为 virtual 并在一个或者多个派生类被重新定义的成员函数 语法规则: virtual 函数返回类型 函数名(参数表) {函数体} 语法分析:虚函数的声明和定义和普通的成员函数一样,只是在返回值之前加入了关键字virtual。      在基类当中定义了虚函数,可以再子类中定义和基类中相同函数名、相同参数、相同返回值和不同实现体的虚函数      定义为虚函数是为了让 基类函数的指针或者引用来指向子类。 #include<iostream> using namespace std; class A { public: void fun() { cout << "A::fun()..." << endl; } }; class B :public A { public: void fun() { cout << "B::fun()...." << endl; } }; int main() { A *a = new A; //A类指针指向A类对象 a->fun(); A *b = new B; //A类指针指向B类 对象 b->fun(); delete a;

多态(C++语言)

倾然丶 夕夏残阳落幕 提交于 2019-12-02 11:24:37
一、多态的定义 派生类对象的地址可以赋值给基类指针。对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。多态可以简单地理解为同一条函数调用语句能调用不同的函数;或者说,对不同对象发送同一消息,使得不同对象有各自不同的行为。 所谓“虚函数”,就是在声明时前面加了 virtual 关键字的成员函数。virtual 关键字只在类定义中的成员函数声明处使用,不能在类外部写成员函数体时使用。静态成员函数不能是虚函数。包含虚函数的类称为“多态类”。 *例如以下程序: #include <iostream> using namespace std; class A { public: virtual void Print() { cout << "A::Print" << endl; } }; class B : public A { public: virtual void Print() { cout << "B::Print" << endl; } }; class D : public A { public: virtual void

c++纯虚函数与抽象基类

一曲冷凌霜 提交于 2019-12-02 11:22:06
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。 1、简介 假设我们有下面的类层次: class A { public : virtual void foo ( ) { cout << "A::foo() is called" << endl ; } } ; class B : public A { public : void foo ( ) { cout << "B::foo() is called" << endl ; } } ; int main ( void ) { A * a = new B ( ) ; a - > foo ( ) ; // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0 ; } 这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。

C++多态

偶尔善良 提交于 2019-12-02 11:06:24
C++多态   多态 按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 下面的实例中,基类 Shape 被派生为两个类,如下所示: #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape{ public: Rectangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape{ public: Triangle( int a=0, int b=0):Shape(a, b) { } int area ()

c++第五次博客作业

本小妞迷上赌 提交于 2019-12-02 11:04:53
       C++虚函数,纯虚函数,抽象类以及虚基类的区别   Part1.C++中的虚函数 什么是虚函数: 直观表达就是,如果一个函数的声明中有 virtual 关键字,那么这个函数就是虚函数。 虚函数的作用: 虚函数的最大作用就是实现面向对象程序设计的一大特点,多态性,多态性表达的是一种动态的概念,是在函数调用期间,进行动态绑定,以达到什么样的对象就实现什么样的功能的效果。 虚函数的一般声明语法: virtual 函数类型 函数名 (形参表) 注意: 虚函数的声明只能出现在类的定义中,不能出现在成员函数实现的时候 虚函数一般不声明为内联函数,但是声明为内联函数也不会引起错误 在运行过程中要实现多态的三个条件: 类之间满足赋值兼容关系(也就是类之间有继承关系) 要声明为虚函数 调用虚函数时,要由成员函数或者是指针和引用来访问 代码举例 #include <iostream> using namespace std; class Base1 { public: public: virtual void play(); }; void Base1::play() { cout << "Base1::play()" << endl; } class Base2: public Base1 { virtual void play(); }; void Base2::play() {

C++ 虚函数

ⅰ亾dé卋堺 提交于 2019-12-02 10:56:31
虚函数 在了解虚函数之前,我们先来考虑一个问题。我们创建一个基类,在它的派生类中声明一个与基类函数同名的函数,声明之后,我们要实现的是通过基类的指针实现对派生类函数的访问。有些人会说,直接将派生类的地址赋值给基类的指针就OK了呀。这样能实现吗?我们通过代码来实验。 #include "pch.h" #include <iostream> using namespace std; class Base1 { public: void display() { cout << "Base1::display()" << endl; } private: }; class Base2:public Base1 { public: void display() { cout << "Base2::display()" << endl; } private: }; class Base3:public Base2 { public: void display() { cout << "Base3::display()" << endl; } private: }; void fun(Base1 *a) { a->display(); } int main() { Base2 b; Base3 c; fun(&b); fun(&c); } 通过将Base2 、Base3的地址传给Base1的指针

重载和多态

江枫思渺然 提交于 2019-12-02 09:51:37
重载与多态 重载与多态与重写的区别: 重载 : 函数名相同,但是函数的参数不同,调用时根据参数的不同决定调用哪一个函数。 多态 : 函数名相同,函数形参相同。调用时根据函数类型时虚函数还是普通函数决定调用哪一个。 重写 : 若子类和父类的某个函数具有相同的函数名,相同的形参列表,且父类中的函数被定义为虚函数,则子类对该函数的实现被称为函数的重写。 caution! 若函数不声明为虚函数,只能通过类名限定名的方式访问父类或者子类的方法。这叫做隐藏。 若函数声明为虚函数,则可以通过指针访问每一个方法,这叫做覆盖。 接下来,让我们分别对以上的概念进行实现: 一.重载 1.函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。 如下例子: #include <iostream> using namespace std; class printData { public: void print(int i) { cout << "整数为: " << i << endl; } void print(double f) { cout << "浮点数为: " << f << endl; } void print(char c[]) { cout << "字符串为: " << c <<

C++中多态实现的关键——虚函数

删除回忆录丶 提交于 2019-12-02 09:13:37
1.多态的作用 在面向对象程序设计中,使用多态能够增强代码的可扩充性,,即程序需要增加或修改部分功能时,只需修改少量代码就能够达到目的,此外多态也能起到精简代码的作用。 而实现多态的关键点,就是虚函数如何使用。 虚函数 1.虚函数的使用方法 .基同类与派生类同时拥有的同名同参数表的函数,在设计时,最好将其声明为虚函数,只需在函数前面加上关键字virtual即可 下面通过一个具体的例子来说明 #include<iostream> using namespace std; class Shape{ public: void Printf(){ cout<<" The Shape has been called"<<endl; } }; class Rectangle:public Shape{ public: void Printf(){ cout<<"The Rectangle has been called"<<endl; } }; class Circle:public Shape{ public: void Printf(){ cout<<"he Circle has been called"<<endl; } }; void Print(Shape &a) { a.Printf(); } void Print(Rectangle &a) { a.Printf(); }

C++课程第五次博客——多态

守給你的承諾、 提交于 2019-12-02 08:16:31
目录 多态性 Part1 多态性概述 Part2 多态实验 Part3 总结 多态性 Part1 多态性概述 多态是指同样的消息被不同类型的对象接收时导致不同的行为。在C++中,所谓信息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。 1)多态的类型 分为四类:重载多态,强制多态,包含多态和参数多态。前两者为专用多态,而后者称为通用多态。 2)多态的实现 分为两类:编译时的多态和运行时的多态。 前者是在 编译的过程中 确定了同名操作的具体操作对象 后者则是在 程序运行过程中 才多态确定操作所针对的具体对象 这种确定操作的具体对象的过程就是绑定,绑定是指计算机程序自身彼此关联的过程,也就是把一条信息和一个对象相结合的过程。绑定工作在编译连接阶段完成的情况称为 静态绑定 ,例如重载,强制和参数多态。而绑定工作在程序运行阶段完成的情况称为 动态绑定 ,例如多态操作对象的确定通过动态绑定完成。 Part2 多态实验 在多态性中,运算符重载、虚函数、纯虚函数和抽象类是相对来说难以理解的,下面我们主要将对这些知识点,设计实验并探索。 运算符重载 第一注意点 当运算符重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个(后置“++”,“--”除外) #include <iostream> using namespace std; class fun{