多态在模板类中的应用

先看一个多态的例子:

class Human {
public:
    virtual void eat = 0;
    virtual ~Human() {}
};

class Men : public Human {
public:
    virtual void eat() {
        cout << "男人" << endl;
    }
};

class Women : public Human {
public:
    virtual void eat() {
        cout << "女人" << endl;
    }
};

多态的两个条件:

  • 父类与子类有继承关系,父类中必须有虚函数,子类重写父类的虚函数;
  • 父类的指针或引用指向/引用子类对象;

模板中的多态,并不需要用到父类以及继承的概念,子类也不需要虚函数。

class Men {
public:
    void eat() {
        cout << "男人" << endl;
    }
};

class Women {
public:
    void eat() {
        cout << "女人" << endl;
    }
};

// 加入函数模板:
template<typename T>
void eatEmp(T& obj) {
    obj.eat();
}

int main() {
    Men objmen;
    Women objwomen;
    eatTmp(objmen);
    eatTmp(objwomen);
}

编译器在编译期间会实例化出eatTmp<Men>和eatTmp<Women>这两个函数,然后不同的类对象obj调用不同类的同名成员函数eat()。

posted @ 2024-03-30 18:27  小熊酱  阅读(20)  评论(0)    收藏  举报