多态的作用

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

CRTP

正常情况下父类是不知道哪个子类的具体情况,CRTP 就是为了达到这个目的。

  1. template <typename T>
  2. class Base {
  3. void doSomething() {
  4. T& derived = static_cast<T&>(*this);
  5. }
  6. private:
  7. Base() = default;
  8. friend T;
  9. };
  10. class Derived : public Base<Derived> {
  11. };

保证类名和模板参数一致,我们可以将父类构造函数声明为 private ,并且将模板参数声明为友元,防止使用时出错。

使用例子

我们实现一个单位类,对于不同的单位都有缩放,扩大的功能,我们没有必要在每个子类中实现一遍,通过继承父类来扩展子类的功能

  1. template <typename T>
  2. class Quantity {
  3. public:
  4. void scale(double a) {
  5. T& self = static_cast<T&>(*this);
  6. self.set_value(self.get_value() * a);
  7. }
  8. double squared() {
  9. T &self = static_cast<T &>(*this);
  10. return self.get_value() * self.get_value();
  11. }
  12. private:
  13. Quantity() = default;
  14. friend T;
  15. };
  16. class Meter : public Quantity<Meter> {
  17. public:
  18. double get_value() const {
  19. return value;
  20. }
  21. void set_value(double v) {
  22. value = v;
  23. }
  24. private:
  25. double value;
  26. };

这就是静态多态,比用虚表实现的多态更加快速