文摘中如何使用类抽象类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强> 1。抽象类的定义强>
首先来说虚函数;
虚函数是在基类中被声明为虚拟的,并在派生类中重新定义的成员函数,可实现函数的动态重载;
动态重载也就是在可以依据后期的传入类的类型,选择具体的实现函数;
<强>纯虚函数的声明有着特殊的语法格式:强> <强>虚拟返回值类型成员函数名(参数表)=0;强>
包含有虚函数是成为抽象类的充要条件;
引用>包含了虚函数的类被称为抽象类,抽象类中可以有纯虚函数,也可以有其他非虚函数,因为抽象类中都是没有定义的虚函数,因此不能定义对象,
在c++中,我们可以把只能用于被继承而不能直接创建对象的类设置为抽象类(抽象类)。
举一个小栗子~ ~
比如我今天想写一个代码,可以自动帮我炒肉菜,我需要实现的效果是,如果传入鸡肉,则做宫保鸡丁;如果传入排骨,则做土豆炖排骨,如果传入牛肉,则做成黑椒牛仔骨;每次只做一道菜;
因为无法预料到具体使用时可能会传入的肉的类型,总不能三个对象都创建?这个时候可以创建<强>抽象类肉类;以及派生类鸡肉,排骨,和牛肉强>,
这三个类中都需要有对应做菜的函数,如厨师();
# includeusing 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模型中为
文摘中如何使用类抽象类