• 【c++ templates读书笔记】【6】模板的多态


    C++中的多态分为动多态和静多态。

    动多态是通过继承和虚函数来实现的,这两个机制都是在运行期进行处理的。平常所谈论的C++多态指的就是这种动多态。

    模板也允许使用单一的泛型标记来关联不同的特定行为,这种借助于模板的关联是在编译器进行处理的,因此把这种多态称为静多态。

    一、动多态

    动多态的设计思想主要在于:对于几个相关对象的类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个虚函数接口。

    动多态例子:

    #include <iostream>
    using namespace std;
    
    class GeoObj{
    public:
    	virtual void draw() const = 0;
    };
    class Circle : public GeoObj{
    public:
    	void draw() const{
    		cout << "circle is drawing!" << endl;
    	}
    };
    class Line : public GeoObj{
    public:
    	void draw() const{
    		cout << "line is drawing!" << endl;
    	}
    };
    void myDraw(GeoObj const& obj){
    	obj.draw();
    }
    
    int main(){
    	Line l;
    	Circle c;
    	myDraw(l);
    	myDraw(c);
    
    	system("pause");
    	return 0;
    }
    

    二、静多态

    静多态例子:

    #include <iostream>
    using namespace std;
    
    class GeoObj{
    public:
    	virtual void draw() const = 0;
    };
    class Circle : public GeoObj{
    public:
    	void draw() const{
    		cout << "circle is drawing!" << endl;
    	}
    };
    class Line : public GeoObj{
    public:
    	void draw() const{
    		cout << "line is drawing!" << endl;
    	}
    };
    template<typename T>
    void myDraw(T const& obj){
    	obj.draw();
    }
    
    int main(){
    	Line l;
    	Circle c;
    	myDraw(l);
    	myDraw(c);
    
    	system("pause");
    	return 0;
    }
    

    三、动多态和静多态比较

    动多态和静多态:

    通过继承实现的多态是绑定的和动态的;通过模板实现的多态是非绑定的和静态的。

    动多态优点:

    a、能够优雅地处理异类集合。

    b、可执行代码的大小通常比较小(因为只需要一个多态函数,但对于静多态而言,为了处理不同的类型,必须生成多个不同的模板实例)。

    c、可以对代码进行完全编译;因此并不需要发布实现源码(但是,分发模板库通常都需要同时分发模板实现的源代码)。

    静多态优点:

    a、可以很容易地实现内建类型的集合。

    b、所生成的代码效率通常比较高(因为并不存在通过指针的间接调用,而且,可以进行演绎的非虚拟函数具有更多的内联机会)。

    c、对于只提供部分接口的具体类型,如果在应用程序中只是使用到这一部分接口,那么也可以使用该具体类型,而不必在乎该类型是否提供其他部分的接口。



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    谈自由 , ASP.NET Core才是未来?
    asp.net core 实现 api网关 进行 api版本控制
    Oracle查询语句参考
    Go语言
    软件测试
    软件设计的重构、重写、重载
    Office 365-sharepoint online
    Pandas入门
    调用Baidu云、人脸识别接口
    Oracle 11g 安装小记
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4921341.html
Copyright © 2020-2023  润新知