前言:针对学习vslam中遇到的问题,回顾多态,做个小总结。
1、在C++中,virtual
和override
关键字用于实现多态性。
2、多态的优点:代码组织结构清晰、可读性强、利于前期和后期的扩展以及维护。
3、多态的分类:
-
静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
-
动态多态: 派生类和虚函数实现运行时多态
4、多态需要满足条件:
- 有继承关系
- 子类重写父类中的虚函数
5、实现多态的简单例子
#include <iostream>
// 基类:交通工具
class Vehicle {
public:
virtual void move() {
std::cout << "交通工具在移动" << std::endl;
}
virtual ~Vehicle() {} // 虚析构函数以确保正确的清理
};
// 派生类:汽车
class Car : public Vehicle {
public:
void move() override {
std::cout << "汽车在移动" << std::endl;
}
};
// 派生类:自行车
class Bicycle : public Vehicle {
public:
void move() override {
std::cout << "自行车在移动" << std::endl;
}
};
// 派生类:飞机
class Airplane : public Vehicle {
public:
void move() override {
std::cout << "飞机在飞行" << std::endl;
}
};
// 函数:执行移动
void DoMove(Vehicle &vehicle) {
vehicle.move();
}
void test01() {
Car car;
DoMove(car);
Bicycle bicycle;
DoMove(bicycle);
Airplane airplane;
DoMove(airplane);
}
int main() {
test01();
// 暂停程序,等待用户输入
std::cout << "按回车键退出程序..." << std::endl;
std::cin.get(); // 等待用户按下回车键
return 0;
}
6、具体问题分析
class VertexSE3LieAlgebra : public g2o::BaseVertex<6, SE3d> {
public:
virtual bool read(istream &is) override {
}
};
virtual关键字:表示这个函数可以在派生类中被重写。
override关键字:在C++11及以后的版本中,这个关键字用于明确指出函数是重写基类中的虚函数。如果函数签名与任何基类中的虚函数不匹配,编译器会报错。
即,virtual bool read(istream &is) override 表明函数read() 是重写基类中的虚函数,同时也可以在派生类中被重写。
函数调用:
ifstream fin(argv[1]);
//使用new操作符动态分配了一个VertexSE3LieAlgebra类型的对象,并将其地址存储在指针v中。
VertexSE3LieAlgebra *v = new VertexSE3LieAlgebra();
//调用了v指向的对象的read成员函数,并将输入流fin作为参数传递给它。read函数可以接受一个std::ifstream类型的参数。
v->read(fin);