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,不进行判断,直接转换