多态在模板类中的应用

先看一个多态的例子:

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 @   小熊酱  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示