文摘中如何使用类抽象类

  

文摘中如何使用类抽象类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强> 1。抽象类的定义

首先来说虚函数;

虚函数是在基类中被声明为虚拟的,并在派生类中重新定义的成员函数,可实现函数的动态重载;

动态重载也就是在可以依据后期的传入类的类型,选择具体的实现函数;

<强>纯虚函数的声明有着特殊的语法格式: <强>虚拟返回值类型成员函数名(参数表)=0;

包含有虚函数是成为抽象类的充要条件;

包含了虚函数的类被称为抽象类,抽象类中可以有纯虚函数,也可以有其他非虚函数,因为抽象类中都是没有定义的虚函数,因此不能定义对象,

在c++中,我们可以把只能用于被继承而不能直接创建对象的类设置为抽象类(抽象类)。

举一个小栗子~ ~

比如我今天想写一个代码,可以自动帮我炒肉菜,我需要实现的效果是,如果传入鸡肉,则做宫保鸡丁;如果传入排骨,则做土豆炖排骨,如果传入牛肉,则做成黑椒牛仔骨;每次只做一道菜;

因为无法预料到具体使用时可能会传入的肉的类型,总不能三个对象都创建?这个时候可以创建<强>抽象类肉类;以及派生类鸡肉,排骨,和牛肉,

这三个类中都需要有对应做菜的函数,如厨师();

 # include
  using  namespace 性传播疾病;
  class  Meat ,,//抽象类:肉类
  {
  公众:
  ,,,virtual  void 库克()=0;//纯虚函数
  };
  
  class 鸡:public  Meat //派生类:鸡的肉
  {
  公众:
  ,,,void 库克(){
  ,,,,,,,cout<& lt;“热锅下油,加入黄瓜丁和胡萝卜丁翻炒至半熟,划入鸡丁翻炒,最后放入买好的宫保鸡丁酱和花生米即可“& lt; endl;
  ,,,}
  };
  
  肉{class 肋骨:public //派生类:排骨
  公众:
  ,,,void 库克(){
  ,,,,,,,cout<& lt;“热锅下油,排骨炒至半熟,放入土豆块翻炒,加水收汁即可“& lt; & lt; endl;
  ,,,}
  };
  
  牛肉:public 肉{class //派生类:牛的肉
  公众:
  ,,,void 库克(){
  ,,,,,,,cout<& lt;“热锅下油,洋葱炒香,加入牛仔骨和黑椒酱,加水收汁即可“& lt; & lt; endl;
  ,,,}
  };
  
  int  main ()
  {
  ,,,Meat  * realmeat;,//定义对象指针数组
  ,,,std:: string  mymeat =,“Chicken";
  ,,,如果(mymeat ==,““) {
  ,,,,,realmeat =, new 鸡();
  ,,,}else 如果(==mymeat “Rib") {
  ,,,,,realmeat =, new 肋骨();;
  ,,,},else  if  (==mymeat “Beef") {
  ,,,,,realmeat =, new 牛肉();
  ,,,}
  ,,,realmeet→库克();
  ,,,return  0;
  
  }

大概的一个例子,不知道有没有解释清楚,有问题欢迎指正,在上面的例子中也能看的到,抽象类是不能创建对象的,但是可以<强>定义指针指向抽象类,

<强>抽象类的规定

(1)抽象类只能用作其他类的基类,不能建立抽象类对象。

(2)抽象类不能用作参数类型,函数返回类型或显式转换的类型。

(3) <强>可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。

2。在ORBSLAM3中的使用

在ORBSLAM3中的使用,也说明了抽象类存在的意义,也就是实现了多态,可以把它理解成一个操作接口,具体的实现在派生类中,

ORBSLAM3中因为新加入了KB模型,这就导致无法在最一开始后时候确定相机的类型,是普通针孔相机(针孔)还是鱼眼相机(使用KB),

如果不使用抽象类的话,以单目相机为例,除了需要为针孔和KB各自创建一个类,同时在需要使用相机参数的时候,定义两个对象,一个针孔、一个KB;

然后,在使用时,只使用其中的一个;

有了抽象类,就可以先将相机的模型声明成一个抽象的类型:GeometricCamera * mpCamera;然后按照配置文件中的输入是针孔还是KannalaBrandt8,定义对象mpCamera即可,如:

 mpCamera =, new 针孔(vCamCalib);,//或者
  mpCamera =, new  KannalaBrandt8 (vCamCalib); 

同时,因为模型不同,不同坐标系之间的转换函数也会不同,以投影函数为例:

首先在抽象类中定义一个虚函数:

 virtual 简历:Point2f 项目(const 简历::Point3f , p3D),=, 0; 

然后具体的实现时,在KB模型中为

文摘中如何使用类抽象类