zoukankan      html  css  js  c++  java
  • CPP Templates 之 类模板的继承

    类模板的继承

    类模板可以继承也可以被继承。

    1.在一个类模板中,一个非依赖型基类是指:无须知道模板实参就可以完全确定类型的
    基类。

    例如:

    template<typename X>
    class Base{
    public:
        int basefield;
        typedef int T;
    };

    class D1:public Base<Base<void> >{//实际上不是模板
        public:
        void f(){basefield = 3; }
    };

    template<typename T>
    class D2:public Base<double>{
     public:
        void f() { basefield = 7; }//正常访问继承成员
        T strange;//T是Base<double>::T,而不是模板参数
    };

    注意事项:对于模板中的非依赖类型而言,如果在他的派生类中查找一个非受限名称,
    那就会先查找这个非依赖型基类,然后才会查找模板参数列表。

    2.非依赖性名称不会在依赖基类中查找

    template<typename X>
    class Base{
    public:
        int basefield;
        typedef int T;
    };

    template <typename T>
    class DD:Base<T>{
    public:
        void f(){
            basefield = 0;//problem
        }

    };

    template<>
    class Base<bool>{
    public:
        enum { basefield = 42 };//tricky
    };

    void g(DD<bool>& d){
        d.f();//opps
    }

    //修改方案一
    template <typename T>
    class DD1:Base<T>{
    public:
        void f(){
            this->basefield=0;//查找被延迟了
        }

    };

    //修改方案二
    template <typename T>
    class DD2:Base<T>{
    public:
        void f(){
            Base<T>::basefield=0;//查找被延迟了
        }

    };

    如果使用修改方案二,如果原来的非受限非依赖型名称是被用于虚函数调用的话,
    那么引入依赖性的限定的话,那么这种引入依赖性的限定将会近之虚函数调用,
    从而也会改变程序的含义,当遇到第二种情况不适合的情况,可以采用方案一
  • 相关阅读:
    第二次冲刺(7)
    第二次冲刺(6)
    第二次冲刺(5)
    【整理】C#文件操作大全(SamWang)<转>
    c# 文件及目录操作类
    BIOS设置之UEFI/Legacy BIOS切换图文详解
    UEFI+GPT引导实践篇(二):UEFI引导安装64位Win7/Win8
    UEFI+GPT引导实践篇(一):切换到UEFI启动,准备安装介质
    UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?
    预装WIN8系统的电脑安装WIN7的方法
  • 原文地址:https://www.cnblogs.com/bayonetxxx/p/1601952.html
Copyright © 2011-2022 走看看