首页 > 编程语言 >C++ 虚函数与纯虚函数

C++ 虚函数与纯虚函数

时间:2024-04-11 10:01:10浏览次数:33  
标签:函数 virtual int C++ height width 纯虚

C++中的虚函数(virtual)是可以被子类重写的成员函数
而纯虚函数(pure virtual)是必须被抽象/基类中的定义的虚函数,必须被派生类实现

virtual type function(){} //虚函数
virtual void funtion1()=0 // 纯虚函数

主要区别:

  1. 实现
    虚函数有实现,而纯虚函数没有实现
    子类中虚函数可以不重写,继承基类;而纯虚函数必须在子类中实现。


  2. 拥有一个以上纯虚函数的类为抽象类,不可以直接实例化对象
    而拥有虚函数的的类不会强制为抽象类,可以实例化

  3. 调用
    直接调用纯虚函数会导致链接错误
    而虚函数可以被调用(派生类重写虚函数,则调用派生类的实现)

例子

  1. 虚函数
#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual 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 ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);
 
   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();
 
   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}
  1. 纯虚函数
#include <iostream>
 
using namespace std;
 
// 基类
class Shape 
{
public:
   // 提供接口框架的纯虚函数
   virtual int getArea() = 0;
   void setWidth(int w)
   {
      width = w;
   }
   void setHeight(int h)
   {
      height = h;
   }
protected:
   int width;
   int height;
};
 
// 派生类
class Rectangle: public Shape
{
public:
   int getArea()
   { 
      return (width * height); 
   }
};
class Triangle: public Shape
{
public:
   int getArea()
   { 
      return (width * height)/2; 
   }
};
 
int main(void)
{
   Rectangle Rect;
   Triangle  Tri;
 
   Rect.setWidth(5);
   Rect.setHeight(7);
   // 输出对象的面积
   cout << "Total Rectangle area: " << Rect.getArea() << endl;
 
   Tri.setWidth(5);
   Tri.setHeight(7);
   // 输出对象的面积
   cout << "Total Triangle area: " << Tri.getArea() << endl; 
 
   return 0;
}

Ref

  1. https://www.runoob.com/cplusplus/cpp-polymorphism.html
  2. https://www.cnblogs.com/dijkstra2003/p/17254053.html

标签:函数,virtual,int,C++,height,width,纯虚
From: https://www.cnblogs.com/liuliu55/p/18128157

相关文章

  • VUE - 使用h函数创建虚拟节点
    VUE-使用h函数创建虚拟节点 1. 如在 antd 的 notification 组件中使用 参考文档:https://1x.antdv.com/components/notification-cn/leth=this.$createElement;that.$notification.error({message:'上传提示',descrip......
  • C++——模板初阶
    目录0.前言1.泛型编程2.函数模板2.1函数模板概念2.1函数模板格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则3.类模板3.1类模板的定义格式3.2类模板的实例化0.前言C++模板是一种泛型编程的工具,允许开发者定义对多种数据类型都适用的代......
  • QtCreator配置C++20开发环境
    我不知道你的QtCreator是什么版本的,但是我觉得操作方案是相同的,让QtCreator编译C++20代码,需要你有一个支持C++20的编译器,不管你是msvc还是gcc,总要有一个。如果你和我一样,用的5.12.12,那真的太巧了,请看步骤吧:配置kit:首先你应该有一个Qt版本的列表,如果没有,请你自行添加,添加的方式......
  • 第十二届蓝桥杯省赛真题(C/C++大学B组)
    目录#A空间#B卡片#C直线#D货物摆放#E路径#F时间显示#G砝码称重#H 杨辉三角形#I双向排序#J括号序列#A空间#include<bits/stdc++.h>usingnamespacestd;intmain(){ cout<<256*1024*1024/4<<endl; return0;}#B卡片#include<bit......
  • 带有 self 和不带 self 定义的函数有着不同的用途和作用范围
    1.带有self的方法: -带有self的方法通常定义在类中,用于操作类的实例对象(即对象的实例属性和方法)。   -当定义类的方法时,第一个参数通常是self,它代表当前类的实例对象,用于访问类的属性和调用其他方法。   -在调用这类方法时,Python会自动将调用对象作为第一个参......
  • C/C++学习笔记-eclipse不支持C++11问题
    转 https://blog.csdn.net/qq_35703954/article/details/81540315std::thread的使用,结果编译报错信息如下: 问题分析:查看错误提示,发现thread不是命名空间std的一个成员,那么我们知道thread很明显是std的成员,那么久只有一种可能:即没有引入相关的头文件,但是检查发现,头文件也有。又......
  • 【测试开发学习历程】python高阶函数
    目录1map()函数2reduce()函数3filter()函数4sorted()函数1map()函数map()函数语法:map(function,iterable)参数:function:函数iterable:一个或多个序列返回值:迭代器对象作用:map()是Python内置的高阶函数,它接收一个函数function和一个iterable,并通过把......
  • 使用 `omit` 函数移除敏感信息
    exportdefaultfunctionomit<Textendsobject,KextendskeyofT>(obj:T,fields:K[]|readonlyK[],):Omit<T,K>{constclone={...obj};if(Array.isArray(fields)){fields.forEach(key=>{deleteclone[key];......
  • Sort函数的使用
    std::sort函数是<algorithm>头文件中的一个模板函数,用于对容器中的元素进行排序。通常,std::sort函数需要三个参数:指向要排序序列的起始位置的迭代器。指向要排序序列的结束位置之后一个位置的迭代器。一个可选的比较函数或可调用对象,用于确定排序顺序。当你只传递两个参数给s......
  • C++ 标准库类型priority_queue
    C/C++总述:StudyC/C++-CSDN博客 堆(数据结构):堆-CSDN博客priority_queue(优先队列)在优先队列中,元素被赋予优先级(按约定的函数来赋予优先级,底层通过堆来实现)。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出(firstin,largestout)的行为特征。定义......