多态的作用
在现实生活中,一个女人可以扮演不同的角色。她可以同时是母亲、雇员和妻子。同一个女人会根据她目前的特定角色执行不同的功能。这就是多态的概念,多态指的就是能够呈现不同的形式。它是面向对象编程的核心特性。例如,当女性作为雇员在工作时,她不太可能具有母亲的特征,反之亦然,当她作为母亲在家时,她不会有雇员的特征。
CRTP
正常情况下父类是不知道哪个子类的具体情况,CRTP 就是为了达到这个目的。
template <typename T>
class Base {
void doSomething() {
T& derived = static_cast<T&>(*this);
}
private:
Base() = default;
friend T;
};
class Derived : public Base<Derived> {
};
保证类名和模板参数一致,我们可以将父类构造函数声明为 private ,并且将模板参数声明为友元,防止使用时出错。
使用例子
我们实现一个单位类,对于不同的单位都有缩放,扩大的功能,我们没有必要在每个子类中实现一遍,通过继承父类来扩展子类的功能
template <typename T>
class Quantity {
public:
void scale(double a) {
T& self = static_cast<T&>(*this);
self.set_value(self.get_value() * a);
}
double squared() {
T &self = static_cast<T &>(*this);
return self.get_value() * self.get_value();
}
private:
Quantity() = default;
friend T;
};
class Meter : public Quantity<Meter> {
public:
double get_value() const {
return value;
}
void set_value(double v) {
value = v;
}
private:
double value;
};
这就是静态多态,比用虚表实现的多态更加快速