C++之多态与虚函数

【C++】动态多态与虚函数 本文【C++】动态多态与虚函数 主要讲述了C++中的多态、虚函数、刨析了多态的底层实现和做了什么、虚析构、纯虚函数和抽象类。以详细的代码示例和例子,使我们学习相关的知识更加通俗易懂。 有感兴趣的小伙伴可以关注一下噢! 阅读详情
面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体。也可以这样说就是实现了“一个接口,多种方法”。

  从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性。前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载。后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容。

  1.不过在说虚函数之前,我想先介绍一个有关于基类与派生类对象之间的复制兼容关系的内容。它也是之后学习虚函数的基础。我们有时候会把整型数据赋值给双精度类型的变量。在赋值之前,先把整形数据转换为双精度的,在把它赋值给双精度类型的变量。这种不同类型数据之间的自动转换和赋值,称为赋值兼容。同样的,在基类和派生类之间也存在着赋值兼容关系,它是指需要基类对象的任何地方都可以使用公有派生类对象来代替。为什么只有公有继承的才可以呢,因为在公有继承中派生类保留了基类中除了构造和析构之外的所有成员,基类的公有或保护成员的访问权限都按原样保留下来,在派生类外可以调用基类的公有函数来访问基类的私有成员。因此基类能实现的功能,派生类也可以。

  那么它们具体是如何体现的呢?(1)派生类对象直接向基类赋值,赋值效果,基类数据成员和派生类中数据成员的值相同;(2)派生类对象可以初始化基类对象引用;(3)派生类对象的地址可以赋给基类对象的指针;(4)函数形参是基类对象或基类对象的引用,在调用函数时,可以用派生类的对象作为实参;

View Code
复制代码
 1 #include "stdafx.h"
 2 #include<iostream>
 3 #include<string>
 4 
 5 class ABCBase
 6 {
 7 private:
 8         std::string ABC;    
 9 public:
10         ABCBase(std::string abc)
11         {
12             ABC=abc;
13         }
14 void showABC();
15 };
16 
17 void ABCBase::showABC()
18 {
19     std::cout<<"字母ABC=>"<<ABC<<std::endl;
20 }
21 
22 class X:public ABCBase
23 {
24 public:
25         X(std::string x):ABCBase(x){}
26 };
27 
28 void function(ABCBase &base)
29 {
30 base.showABC();
31 }
32 
33 
34 int main()
35 {
36     ABCBase base("A");
37 base.showABC();
38 
39     X x("B");
40 base=x;
41 base.showABC();
42 
43     ABCBase &base1=x;
44     base1.showABC();
45 
46     ABCBase *base2=&x;
47     base2->showABC();
48 
49     function(x);
50 
51 return0;
52 }
复制代码

结果:

要注意的是:第一,在基类和派生类对象的赋值时,该派生类必须是公有继承的。第二,只允许派生类对象向基类对象赋值,反过来不允许;

  2.紧接着来讲一下虚函数,它允许函数调用与函数体之间的联系在运行时才建立,即在运行时才决定如何动作。虚函数声明的格式:

  virtual 返回类型 函数名(形参表)

  {

    函数体

  }

那么定义虚函数有什么用呢?让我们先来看看下面这个示例:

View Code
复制代码
 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <string>
 4 
 5 
 6 class Graph
 7 {
 8 protected:
 9 double x;
10 double y;
11 public:
12         Graph(double x,double y);
13 void showArea();
14 };
15 
16 Graph::Graph(double x,double y)
17 {
18 this->x=x;
19 this->y=y;
20 }
21 
22 void Graph::showArea()
23 {
24     std::cout<<"计算图形面积"<<std::endl;
25 }
26 
27 class Rectangle:public Graph
28 {
29 public:
30         Rectangle(double x,double y):Graph(x,y){};
31 void showArea();
32 };
33 
34 void Rectangle::showArea()
35 {
36     std::cout<<"矩形面积为:"<<x*y<<std::endl;
37 }
38 
39 class Triangle:public Graph
40 {
41 public:
42         Triangle(double d,double h):Graph(d,h){};
43 void showArea();
44 };
45 
46 void Triangle::showArea()
47 {
48     std::cout<<"三角形面积为:"<<x*y*0.5<<std::endl;
49 }
50 
51 class Circle:public Graph
52 {
53 public:
54         Circle(double r):Graph(r,r){};
55 void showArea();
56 };
57 
58 void Circle::showArea()
59 {
60     std::cout<<"圆形面积为:"<<3.14*x*y<<std::endl;
61 }
62 
63 int main()
64 {
65     Graph *graph;
66 
67     Rectangle rectangle(10,5);
68     graph=&rectangle;
69     graph->showArea();
70 
71     Triangle triangle(5,2.4);
72     graph=&triangle;
73     graph->showArea();
74 
75     Circle circle(2);
76     graph=&circle;
77     graph->showArea();
78 
79 return0;
80 }
复制代码

结果:

结果似乎和我们想象的不一样,既然Graph类(图形类)的对象graph指针分别指向了Rectangle类(矩形类)对象,Triangle类(三角类)对象,以及Circle类(圆类)对象,那么就应该执行它们自己所对应成员函数showArea(),怎么结果会是Graph类(图形类)的对象graph里的成员函数呢?这好像和我们在C++之继承与派生(2)一节里所讲到的派生类成员覆盖了基类中使用相同名称的成员(派生类对象调用同名成员函数是来自于自己类中成员函数,而非基类中上的)有所不同啊,其实当基类对象指针指向公有派生类的对象时,它只能访问从基类继承下来的成员,而不能访问派生类中定义的成员。但是使用动态指针就是为了表达一种动态调用的性质即当前指针指向哪个对象,就调用那个对象对应类的成员函数。那要怎么来解决的,这时虚函数就体现出了它的作用。其实我们只需要对上一个示例代码中所有的类里出现的showArea()函数声明之前加一个关键字virtual:

View Code
复制代码
 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <string>
 4 
 5 
 6 class Graph
 7 {
 8 protected:
 9 double x;
10 double y;
11 public:
12         Graph(double x,double y);
13 voidvirtual showArea();//定义为虚函数或virtual void showArea()
14 };
15 
16 Graph::Graph(double x,double y)
17 {
18 this->x=x;
19 this->y=y;
20 }
21 
22 void Graph::showArea()
23 {
24     std::cout<<"计算图形面积"<<std::endl;
25 }
26 
27 class Rectangle:public Graph
28 {
29 public:
30         Rectangle(double x,double y):Graph(x,y){};
31 virtualvoid showArea();//定义为虚函数
32 };
33 
34 void Rectangle::showArea()
35 {
36     std::cout<<"矩形面积为:"<<x*y<<std::endl;
37 }
38 
39 class Triangle:public Graph
40 {
41 public:
42         Triangle(double d,double h):Graph(d,h){};
43 virtualvoid showArea();//定义为虚函数
44 };
45 
46 void Triangle::showArea()
47 {
48     std::cout<<"三角形面积为:"<<x*y*0.5<<std::endl;
49 }
50 
51 class Circle:public Graph
52 {
53 public:
54         Circle(double r):Graph(r,r){};
55 virtualvoid showArea();//定义为虚函数
56 };
57 
58 void Circle::showArea()
59 {
60     std::cout<<"圆形面积为:"<<3.14*x*y<<std::endl;
61 }
62 
63 int main()
64 {
65     Graph *graph;
66 
67     Rectangle rectangle(10,5);
68     graph=&rectangle;
69     graph->showArea();
70 
71     Triangle triangle(5,2.4);
72     graph=&triangle;
73     graph->showArea();
74 
75     Circle circle(2);
76     graph=&circle;
77     graph->showArea();
78 
79 return0;
80 }
复制代码

其它代码原封不动,这样运行出来的结果就是我们所需要的:

在基类中的某成员函数被声明为虚函数后,在之后的派生类中科以重新来定义它。但定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型的顺序,都必须和基类中的原型完全相同。其实在上述修改后的示例代码里,只要在基类中显式声明了虚函数,那么在之后的派生类中就需要用virtual来显式声明了,可以略去,因为系统会根据其是否和基类中虚函数原型完全相同来判断是不是虚函数。因此,上述派生类中的虚函数如果不显式声明也还是虚函数。最后对虚函数做几点补充说明:(1)因为虚函数使用的基础是赋值兼容,而赋值兼容成立的条件是派生类之从基类公有派生而来。所以使用虚函数,派生类必须是基类公有派生的;(2)定义虚函数,不一定要在最高层的类中,而是看在需要动态多态性的几个层次中的最高层类中声明虚函数;(3)虽然在上述示例代码中main()主函数实现部分,我们也可以使用相应图形对象和点运算符的方式来访问虚函数,如:rectangcle.showArea(),但是这种调用在编译时进行静态联编,它没有充分利用虚函数的特性。只有通过基类对象来访问虚函数才能获得动态联编的特性;(4)一个虚函数无论配公有继承了多少次,它仍然是虚函数;(5)虚函数必须是所在类的成员函数,而不能是友元函数,也不能是静态成员函数。因为虚函数调用要靠特定的对象类决定该激活哪一个函数;(6)内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的即使虚函数在类内部定义,编译时将其看作非内联;(7)构造函数不能是虚函数,但析构函数可以是虚函数;

  如果在main()主函数中用new建立一个派生类无名对象和定义一个基类对象指针,并将无名对象的地址赋给基类对象指针时,当我们用delete运算符来撤销无名对象时,系统只执行基类析构函数,而不执行派生类析构函数。比如:

View Code
 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <string>
 4 
 5 
 6 class Graph
 7 {
 8 protected:
 9 double x;
10 double y;
11 public:
12         Graph(double x,double y);
13 voidvirtual showArea();//定义为虚函数或virtual void showArea()
14 ~Graph();
15 };
16 
17 Graph::Graph(double x,double y)
18 {
19 this->x=x;
20 this->y=y;
21 }
22 
23 void Graph::showArea()
24 {
25     std::cout<<"计算图形面积"<<std::endl;
26 }
27 
28 Graph::~Graph()
29 {
30     std::cout<<"调用图形类析构函数"<<std::endl;
31 }
32 
33 class Rectangle:public Graph
34 {
35 public:
36         Rectangle(double x,double y):Graph(x,y){};
37 virtualvoid showArea();//定义为虚函数
38 ~Rectangle();
39 };
40 
41 void Rectangle::showArea()
42 {
43     std::cout<<"矩形面积为:"<<x*y<<std::endl;
44 }
45 
46 Rectangle::~Rectangle()
47 {
48     std::cout<<"调用矩形类析构函数"<<std::endl;
49 }
50 
51 int main()
52 {
53     Graph *graph;
54     graph=new Rectangle(10,5);
55     graph->showArea();
56 
57     delete graph;
58 
59 return0;
60 }

结果:

因为在撤销指针graph所指的派生类对象,在调用析构函数时,采用静态联编,只调用了Graph类的析构函数。如果也想调用派生类Rectangle类的析构函数的话,可将Graph类的析构函数定义为虚析构函数。其定义的一般格式:

  virtual ~类名()

  {

    函数体

  };

虽然派生类的析构函数与基类的析构函数名字不同,但是如果将基类的析构函数定义为虚函数,由该基类派生而来的所有派生类的析构函数都自动成为虚函数。我们把上一示例中的Graph类的析构函数前加上关键字virtual,那么执行结果:

显然这个结果才是我们所需要的。

  3.上述示例中用了虚函数后,会发现其实Graph类(图形类)中的虚函数的函数体根本没有被用到过,就算被用到,该基类体现了图形的抽象的概念,并不与具体事物相联系。所以基类中的虚函数也没有实质性的功能。因此我们只需要在基类中留下一个函数名,而具体的实现留给派生类去定义。在C++中就是用纯虚函数来说明的。纯虚函数的一般形式:

  virtual 返回类型 函数名(形参表)=0;

这里的"=0"并不是函数的返回值等于零,它只是起到形式上的作用,告诉编译系统"这是纯虚函数"。纯虚函数不具备函数功能,不能被调用。

复制代码
 1 class Graph
 2 {
 3 protected:
 4 double x;
 5 double y;
 6 public:
 7         Graph(double x,double y);
 8 voidvirtual showArea()=0;//定义纯虚函数
 9 };
10 
11 Graph::Graph(double x,double y)
12 {
13 this->x=x;
14 this->y=y;
15 }
复制代码

  4.如果一个类中至少有一个纯虚函数,那么就称该类为抽象类。所以上述中Graph类就是抽象类。对于抽象类有以下几个注意点:(1)抽象类只能作为其他类的基类来使用,不能建立抽象类对象;(2)不允许从具体类中派生出抽象类(不包含纯虚函数的普通类);(3)抽象类不能用作函数的参数类型、返回类型和显示转化类型;(4)如果派生类中没有定义纯虚函数的实现,而只是继承成了基类的纯虚函数。那么该派生类仍然为抽象类。一旦给出了对基类中虚函数的实现,那么派生类就不是抽象类了,而是可以建立对象的具体类;

  5.最后还是一样,我将用一个实例来总结一下今天所讲的内容(开发工具:vs2010):

View Code
复制代码
  1 #include "stdafx.h"
  2 #include <iostream>
  3 #include <string>
  4 
  5 
  6 class Graph //抽象类
  7 {
  8 protected:
  9 double x;
 10 double y;
 11 public:
 12         Graph(double x,double y);
 13 //void virtual showArea();//定义为虚函数或virtual void showArea()
 14 voidvirtual showArea()=0;//定义纯虚函数
 15 virtual~Graph();//定义虚析构函数
 16 };
 17 
 18 Graph::Graph(double x,double y)
 19 {
 20 this->x=x;
 21 this->y=y;
 22 }
 23 
 24 void Graph::showArea()
 25 {
 26     std::cout<<"计算图形面积"<<std::endl;
 27 }
 28 
 29 Graph::~Graph()
 30 {
 31     std::cout<<"调用图形类析构函数"<<std::endl;
 32 }
 33 
 34 class Rectangle:public Graph
 35 {
 36 public:
 37         Rectangle(double x,double y):Graph(x,y){};
 38 void showArea();//虚函数
 39 ~Rectangle();//虚析构函数
 40 };
 41 
 42 void Rectangle::showArea()
 43 {
 44     std::cout<<"矩形面积为:"<<x*y<<std::endl;
 45 }
 46 
 47 Rectangle::~Rectangle()
 48 {
 49     std::cout<<"调用矩形类析构函数"<<std::endl;
 50 }
 51 
 52 class Triangle:public Graph
 53 {
 54 public:
 55         Triangle(double d,double h):Graph(d,h){};
 56 virtualvoid showArea();//虚函数
 57 ~Triangle();//虚析构函数
 58 };
 59 
 60 void Triangle::showArea()
 61 {
 62     std::cout<<"三角形面积为:"<<x*y*0.5<<std::endl;
 63 }
 64 
 65 Triangle::~Triangle()
 66 {
 67     std::cout<<"调用三角形类析构函数"<<std::endl;
 68 }
 69 
 70 
 71 class Circle:public Graph
 72 {
 73 public:
 74         Circle(double r):Graph(r,r){};
 75 virtualvoid showArea();//虚函数
 76 ~Circle();//虚析构函数
 77 };
 78 
 79 void Circle::showArea()
 80 {
 81     std::cout<<"圆形面积为:"<<3.14*x*y<<std::endl;
 82 }
 83 
 84 Circle::~Circle()
 85 {
 86     std::cout<<"调用圆形类析构函数"<<std::endl;
 87 }
 88 
 89 int main()
 90 {
 91     {
 92 //Graph g(10,10);//抽象类不能建立对象
 93 
 94         Graph *graph;
 95 
 96         Rectangle rectangle(10,5);
 97         graph=&rectangle;
 98         graph->showArea();
 99 
100         Triangle triangle(5,2.4);
101         graph=&triangle;
102         graph->showArea();
103 
104 
105         Graph *graph1;
106         graph1=new Circle(2);//new运算符建立无名对象
107         graph1->showArea();
108 
109         delete graph1;//delete运算符撤销派生类Circle无名对象
110     }
111 
112 return0;
113 }
复制代码

结果:

C++多态与虚函数 阅读详情

相关推荐

保姆级教程:Java调用海康SDK实现录像回放与倍速播放(附完整代码)

本文详细介绍了如何使用Java调用海康SDK实现录像回放与倍速播放功能,包括开发环境配置、设备连接、流媒体处理、倍速播放实现及性能优化等关键步骤。通过完整的代码示例和实战经验,帮助开发者快速构建智能录像回放系统,提升开发效率。

weixin_29285605的博客 357

C++之多态性与虚函数

  面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体。也可以这样说就是实现了“一个接口,多种方法”。   从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性。前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载。后者则是通过动态联编来实现的,在C...

weixin_30315905的博客 310

DSSAT模型建模教程

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。现有版本V4.7能模拟27种主要农作物的生长发育和产量形成过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。如果你是个模型入门者,这次将让你体验一键模拟的乐趣。

weixin_55561616的博客 1413

多态性和虚函数【C++】

多态性和虚函数【C++】 一、多态性的概念 1、绑定 把函数体和函数调用相联系称为绑定。程序自身彼此关联的过程,也就是把一个标识符名和 一个存储地址联系在一起的过程。按照绑定进行的阶段不同,可以分为两种不同的绑定方法:静态 绑定和动态绑定。 2、静态绑定(静态联编) 联编工作出现在编译阶段,用对象名或者类名来限定要调用的函数。 C++ 中,默认的函数调用绑定方式为早绑定,也叫静态绑定,即在程序运行之前,由编译器 和连接器实现。 3、动态绑定...

qq_45783047的博客 530

登临科技Goldwasser加速卡Python SDK实战:从环境配置到YOLOv5模型性能压测

本文详细介绍了登临科技Goldwasser加速卡的Python SDK实战指南,从环境配置到YOLOv5模型性能压测的全过程。通过驱动安装、SDK环境搭建、模型转换与推理优化等步骤,帮助开发者高效利用AI加速卡提升深度学习模型性能。重点分享了批量推理压测技巧和常见问题解决方案,助力开发者充分发挥Goldwasser加速卡的算力优势。

weixin_29035147的博客 300

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3870

浅谈C++多态性

C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。   多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphisn),字面意思多种形状。   C++多态性是通过虚函数来实现的,虚函数允许子类重新...

编程资料大全 930

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3259

C++多态性与虚函数:从原理到实战,彻底搞懂面向对象的核心

本文系统讲解了C++多态性和虚函数的核心概念与应用。主要内容包括:1)多态性分类(静态/动态)及虚函数定义;2)通过虚函数实现动态多态的方法;3)虚函数底层原理(虚表/虚指针);4)纯虚函数与抽象类的规范用法;5)常见误区与解决方案(如虚析构函数、函数签名一致性等);6)多态在接口统一、模块协作等场景的实际应用。重点强调动态多态的实现条件(基类虚函数+派生类重写+基类指针/引用)和注意事项,帮助开发者正确运用多态特性提升代码质量。

2401_89207098的博客 669

YOLOv9改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

本文记录的是改进YOLOv9的损失函数,将其替换成Slide Loss,并详细说明了优化原因,注意事项等。Slide Loss函数可以有效地解决样本不平衡问题,为困难样本赋予更高的权重,使模型在训练过程中更加关注困难样本。若是在自己的数据集中发现容易样本的数量非常大,而困难样本相对稀疏,可尝试使用Slide Loss来提高模型在处理复杂样本时的性能。

Limiiiing的博客 2596

智能硬件产品:做好一款电子硬件产品,工具必不可少

上到战略规划,中至运营策略,下至人性洞察,。最初做产品时,笔者从一开始就陷入到了对工具的痴迷,包括:PS、AutoCAD、PROE、犀牛、Axure、Keyshot、Altium……大概将 2 个多月的时间和精力都消耗在了学习使用工具上。通过工具的运用也确实提高了工作效率,在仅有创意的前提下通过灵活运用工具,一年内便成功申请了多个实用新型专利、设计了多款产品的高保真原型图等。正在上传…重新上传取消。

产品线负责人 1442

C++专题:多态性与虚函数(详细!)

对C++的多态性和虚函数进行了详细介绍

m0_70983574的博客 2693

YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 718

[cpp进阶]多态和虚函数

文章目录多态的概念 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 比如说: 买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。 买票这一个行为,不同的人做就有不同的行为和结果,这就是多态。 ...

weixin_53027918的博客 1242

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

CPP多态性与虚函数

文章目录多态性与虚函数面向对象程序设计中的多态性派生类与基类对象之间的赋值虚函数虚析构函数纯虚函数(抽象类)虚函数与虚基类派生类中重定义基类中的重载函数虚函数动态绑定的实现原理 多态性与虚函数 面向对象程序设计中的多态性 多态性(polymorphism) 调用同一个函数名,根据需要实现不同的功能。 编译时的多态性:静态多态(函数重载、运算符重载) 运行时的多态性:动态多态(虚函数) 函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时就能决定调用的是哪个函数。静态多态性又称编译时的多态性。静态

SongyangJi 1589

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++ 多态与虚函数

文章目录1. 多态的概念多态的性质多态的分类2. 虚函数实现动态多态性多态的构成条件虚函数虚函数重写的两个例外(不是特定规则)C++11 override 和 final3.纯虚函数与抽象类纯虚函数:抽象类接口继承和实现继承4.多态的原理虚函数表动态绑定与静态绑定(关联)5.单继承和多继承关系中的虚函数表 多态的概念 多态的定义及实现 抽象类 多态的原理 单继承和多继承关系中的虚函数表 继承和多态常见的面试问题 1. 多态的概念 多态的性质 多态性是面向对象程序设计的一个重要特性。 多态本意:一个事物有

e我所欲也的博客 1309

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ 多态和虚函数

虚函数实现多态 #include <iostream> using namespace std; //基类People class People{ public: virtual void display(); //声明为虚函数 }; void People::display(){ cout<<"无业游民。"<<endl; } //派生类Teacher class Teacher: public People{ public: virtu

少说,多做。 5684

C++ 虚函数与多态性

多态性 面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体,也可以这样说就是实现了“一个接口,多种方法” ...

Chroniccandy的博客 2512

C++虚函数与多态详解

虚函数与多态

君鼎的博客 1130

【C++】继承、虚函数、多态

详细介绍C++的继承、虚函数、多态以及虚函数表,并通过代码示例说明

weixin_40514381的博客 1459

深入研究C++多态与虚函数机制

多态的概念;多态的定义及实现:多态的构成条件、虚函数、虚函数的重写、虚函数重写的两个例外、override和final(C++11)、重载、覆盖(重写)、隐藏(重定义);抽象类:概念,接口继承和实现继承;多态的原理:虚函数表、多态的原理、动态绑定和静态绑定;单继承和多继承关系的虚函数表:单继承中的虚函数表、多继承中的虚函数表、菱形继承、菱形虚拟继承;继承和多态常见的面试问题:概念考察,问答题。

Russ_Leo的博客 1279

C++:虚函数与多态

本文介绍了C++中的虚函数与多态的概念,并介绍了虚函数与多态的实现原理。

2301_79959126的博客 1484

C++ 虚函数与多态

摘要: 多态是C++中通过虚函数实现的运行时动态绑定机制,允许基类指针或引用根据实际对象类型调用不同函数。实现多态需满足三个条件:继承关系、基类虚函数声明、通过基类指针/引用调用。

平平无奇的小甜菜 1031

C++多态, 虚函数, 纯虚函数

多态:不同对象接收相同的消息产生不同的动作。多态包括编译时多态和运行时多态   运行时多态是:通过继承和虚函数来体现的。 编译时多态:运算符重载上。 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。多态也有代码重用的功能,还有解决项目中紧耦合的问题,提高程序的可扩展性。C++实现多态的机制很简单,在继承体系下,将父类的某个函数...

yangxueyangxue的博客 972
上一篇: vitual析构函数的作用
下一篇: C结构体之位域
eric_arrow
博客等级 码龄14年 65粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值