首页 > 编程语言 >C++自学笔记 多态性的实现 How virtual work in C++

C++自学笔记 多态性的实现 How virtual work in C++

时间:2022-10-04 20:58:43浏览次数:55  
标签:函数 C++ 多态性 virtual 联编 纯虚 基类 抽象类

 

静态联编所支持的多态性称为编译时的多态性。
当调用重载函数时,编译器可以根据调用时所使用的实参在编译时就确定下应调用哪个函数。

动态联编所支持的多态性称为运行时的多态性,这是由虚函数来支持。
虚函数类似于重载函数,但与重载函数的实现策略不同,即对虚函数的调用使用动态联编。

 

如果让编译器动态联编,也就是在编译“Point *p = &c”语句时,只根据兼容性规则检查它的合理性,也就是检查是否符合“派生类对象的地址可以赋给基类的指针”的条件。至于“p->area()”调用哪个函数,等程序运行到这里时再决定。(虚函数可以做到)

 

一旦基类定义了虚函数,该基类的派生类中的同名函数也自动成为虚函数。

 

虚函数只能是类中的一个成员函数,但不能是静态成员,关键字virtual用于类中该函数的声明中。

 

关键字virtual指示C++编译器对调用虚函数进行动态联编。

 

在构造函数和析构函数中调用虚函数采用静态联编。即它们调用的虚函数是自己类或基类中定义的函数。

 

由于析构函数不允许有参数,因此一个类只能有一个虚析构函数。

 

虚函数与抽象类

在许多情况下,不能在基类中为虚函数给出一个有意义地定义,这时可以将它说明为纯虚函数,将其定义留给派生类去做。说明纯虚函数地一般形式如下:

class Point{
  virtual int area(int) = 0;
  virtual double area() = 0;
}

一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类。
一个类可以说明多个纯虚函数,包含有纯虚函数的类成为抽象类。
一个类可以说明多个纯虚函数,包含有纯虚函数的类成为抽象类。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。

从一个抽象类派生的类必须提供纯虚函数的实现代码,或在该派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。

标签:函数,C++,多态性,virtual,联编,纯虚,基类,抽象类
From: https://www.cnblogs.com/slowlydance2me/p/16754428.html

相关文章

  • C++ separation compile multiple files into object files via g++ -c
    1.Theprojectstructureasbelow  TheModelfolderandmaincppfile.2.CompilethefilesinModelfolderviag++-casbelowandgenerate*.o objectf......
  • C++自学笔记 多态性 Polymorphism
      virtual关键字虚函数/虚方法  前缀virtual关键字表示子类父类有联系 virtual的作用是告诉编译器,对该函数的调用是通过指针或者引用的话,在运行时才可以确......
  • C++标准库iostream
    iostream标准库iostream是C++的标准库之一,为内置类型对象提供了输入输出支持,同时也支持文件的输入输出,封装的命名空间名称为std。C++的I/O发生在流中,流是字节序列。iost......
  • 无重复字符的最长子串 leetcode 3 C++ 滑动窗口
    C++版本的滑动窗口解决方案class Solution {public:    int lengthOfLongestSubstring(string s) {            if(s.empty()) return 0; ......
  • C++的命名空间
    C++的命名空间在C++的应用中,可能会出现在不同的库中存在相同名称的函数,导致名称冲突;因此引入命名空间这一概念,用于区分不同库中相同名称的函数、类、变量等。 1、作用......
  • 项目开发神器VsCode配置指南!(含C++、Python、Java环境配置)
     Datawhale干货 作者:吴忠强,东北大学,Datawhale成员本篇文章虽然是VsCode挂名,但其实介绍了两款神器:Vscode和Vim,这两个结合起来,开发效率蹭蹭蹭!!!之前接触过VsCode但很少......
  • 25-70K*14薪| 梅卡曼德视觉算法、C++软件开发工程师等职位招聘
    3D视觉工坊致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁。高级C++软件开发工程师薪水:25K-60K*14薪岗位职责:1、负责相关软件系统(客户端)的设......
  • C++ 实现有汉字和英文的字符串逆转
    设指针p1指向初始字符串s,再新建一个字符串tmp用来存放逆转后的字符。此时可以把p1和tmp看成两条链表,指针p2为实现逆转的中转站,p2的长度为tmp和s的长度之和,接下来就通过链表......
  • C++并发编程 [02] :线程管控
    发起线程线程通过构建std::thread对象而启动,该对象指明线程要运行的任务。可以传入任何可调类型给std::thread来构建一个std::thread对象。需要包含头文件<thread......
  • Effective C++ - 条款7 - 关于基类的virtual析构和non-virtual析构
    如果基类的析构是non-virtual的,在使用baseclass指针指向一个derived对象,并且这个对象由baseclass指针删除时,derived对象的成分并没有被删除,原因是baseclass定义了一个n......