#include <iostream>
using namespace std;
// 动多态
class VirObj {
public:
virtual void what() const {
cout << "Obj !!!" << endl;
}
};
class VirAnimal : public VirObj {
public:
void what() const override {
cout << "Animal !!!" << endl;
}
};
// CRTP 静多态
template<typename T>
class Base {
public:
void what() const {
((T *)this)->sayWhat();
}
};
class BaseAnimal : public Base<BaseAnimal> {
public:
void sayWhat() const { //NOLINT
cout << "BaseAnimal !!!" << endl;
}
};
// 动多态的使用方式
template<typename T>
void virtualWhat(const T &t) {
t.what();
}
// 静多态的使用方式, 注意观察二者的差别
template<typename T>
void noVirtualWhat(const Base<T> &t) {
t.what();
}
int main() {
// 函数调用
BaseAnimal ba;
noVirtualWhat(ba);
VirObj *vo = new VirAnimal;
virtualWhat(*vo);
// 对象指针
Base<BaseAnimal>* bba = new BaseAnimal;
bba->what();
vo->what();
}
c++ CRTP静多态的实现(vs 动多态)
最新推荐文章于 2024-02-24 19:29:36 发布