多态的作用
在现实生活中,一个女人可以扮演不同的角色。她可以同时是母亲、雇员和妻子。同一个女人会根据她目前的特定角色执行不同的功能。这就是多态的概念,多态指的就是能够呈现不同的形式。它是面向对象编程的核心特性。例如,当女性作为雇员在工作时,她不太可能具有母亲的特征,反之亦然,当她作为母亲在家时,她不会有雇员的特征。
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;};
这就是静态多态,比用虚表实现的多态更加快速
