cpp 多态中的 virtual 和 override

前言:针对学习vslam中遇到的问题,回顾多态,做个小总结。

1、在C++中,virtualoverride关键字用于实现多态性。

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值