C++面向对象之协议类,多继承与动态转换

Bilibili-打洞哥不打洞视频笔记C++面向对象之协议类,多继承与动态转换

协议类

A is (a kind of) B  -- 继承 (实体类)

A could be B  --  遵守 (协议类) /  实现 (接口类)

#include <iostream>
#include <string>

class DataSource
{
public:
    virtual int DataSize() const = 0; // 虚函数后面加=0表示纯虚函数(子类必须实现,子类不实现,仍然是抽象类)数字只能为0。
    // !抽象类不可以创建对象
    virtual void GetData(int index, std::string &data) const = 0;
}; // 协议类 ,只定义需要哪些实现方法,具体的实现方法需要在子类中完成

class View
{
public:
    void SetDataSource(DataSource *data_source);
    void PrintData();

private:
    DataSource *data_source_; // 数据源的指针
};

void View::SetDataSource(DataSource *data_source)
{
    data_source_ = data_source;
}

void View::PrintData()
{
    if (data_source_ == nullptr)
    {
        return;
    }
    auto size = data_source_->DataSize();
    for (int i = 0; i < size; i++)
    {
        std::string data;
        data_source_->GetData(i, data);
        std::cout << i << "->" << data << std::endl;
    }
}

class NetworkRequest
{
public:
    void Request() {
    };
};

class MainBoardRequest : public NetworkRequest, public DataSource
//                          实际父类                协议类(由于继承了DataSource,就必须实现其中定义的方法)
// 语法上是多继承
{
public:
    int DataSize() const override;
    void GetData(int index, std::string &data) const override;
};
int MainBoardRequest::DataSize() const
{
    return 5;
}
void MainBoardRequest::GetData(int index, std::string &data) const
{
    data.assign("data:" + std::to_string(index));
}

void Demo()
{
    MainBoardRequest mbr;
    View v;
    v.SetDataSource(&mbr);
    v.PrintData();
}

动态转换

static_cast<type>(expression) -- 强制类型转换

const_cast<type>(expression) -- 去const,有可能引发未定义行为

reinterpret_cast<type>(expression)  --  指针转换的重解释 eg:int*->char *

//子类指针/引用->父类static_cast

//父类转换为子类 dynamic_cast //运行时进行判断,如果可以转换成功,返回正确指针,转换失败返回空指针

//若用reinterpret_cast,不进行判断,直接转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值