美文网首页
类模版继承

类模版继承

作者: Sheik | 来源:发表于2021-08-04 20:39 被阅读0次

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

1.父类是模版类,子类继承的时候,需要明确T的类型。
2.如果为了灵活变化类型,那么子类也必须是模版类.

emplate<class T>
class Base{
public:
    T t;
};

class Son1:public Base<int>{//父类是模版类,子类继承的时候,需要明确T的类型。

};

template<class T1,class T2>
class Son2:public Base<T2>{
public:
    Son2(){
        cout << "T1的类型是:"<< typeid(T1).name()<<endl;//T1的类型是:i
        cout << "T2的类型是:"<< typeid(T2).name()<<endl;//T2的类型是:c
    }
    T1 t1;
};

void test(){
    Son2<int,char> son2;
}

类模版中成员函数的类外实现

template<class T1,class T2>
class Person{
public:
    Person(T1 name,T2 age);
    T1 m_Name;
    T2 m_Age;
    void showPerson();
};

template<class T1,class T2>//这个需要写下来,让其知道T1 和 T2是类模版
Person<T1,T2>::Person(T1 name,T2 age){//这里记得在双冒号前面把类模版的类型加进去。
    this->m_Name = name;
    this->m_Age = age;
}
template<class T1,class T2>//这个需要写下来,让其知道T1 和 T2是类模版
void Person<T1,T2>::showPerson(){//这里记得在双冒号前面把类模版的类型加进去。
    cout << "姓名:"<<this->m_Name<<"年龄:"<<this->m_Age<<endl;//姓名:sheik年龄:20
}

void test(){
    Person<string,int>person("sheik",20);
    person.showPerson();
}

类模版分文件编写:
由于类模版的成员函数都是调用的时候创建,那么引用.h文件是找不到相关的函数。为了解决这一问题,有两种方法可以解决:
1.直接引用类模版的cpp文件,类似于#include "*.cpp"
2.可以将类模版的h文件和cpp 写到一个文件中,统称为hpp文件,看到hpp文件就是类模版。
其中第二种方式是比较主流的解决这一问题的方式

#include <iostream>
using namespace std;
#ifndef CHAPTER6_PERSON_HPP
#define CHAPTER6_PERSON_HPP
template<class T1,class T2>
class Person{
public:
    Person(T1 name,T2 age);
    void showPerson();
    T1 m_Name;
    T2 m_Age;
};

template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age){
    this->m_Name = name;
    this->m_Age = age;
}

template<class T1,class T2>
void Person<T1,T2>::showPerson(){
    cout <<"姓名:"<<this->m_Name<<"年龄:"<<this->m_Age<<endl;
}

#endif //CHAPTER6_PERSON_HPP

#include "person.hpp"

void test(){
    Person<string,int>person("sheik",20);
    person.showPerson();

}

类模版的友元,这里建议类内实现。而不要在全局实现。比较麻烦。

template<class T1, class T2>//这里让下面PersonT能看到定义。并且告知是一个模版类。
class PersonT;

template<class T1, class T2>//写这个让这个参数知道范型的类型。
void showPerson(PersonT<T1, T2> &p){
    cout << "类外实现姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;
}
template<class T1, class T2>
class PersonT {

   //这里直接通过friend 让这个函数升级为全局函数。可以直接调用。
//    friend void showPerson(PersonT<T1, T2> &p) {
//        cout << "类内实现姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;
//    }

     //通过全局函数来实现。这里添加一个声明,而且要在函数名后面加<>告知这要在类外实现。
     friend void showPerson<>(PersonT<T1, T2> &p);
public:
    PersonT(T1 name, T2 age) {
        this->m_Name = name;
        this->m_Age = age;
    }

private:
    T1 m_Name;
    T2 m_Age;
};

void test() {
    PersonT<string, int> p("sheik", 20);
    showPerson(p);
}

相关文章

  • 类模版继承

    环境:ide:Mac+clion 视频链接:https://www.bilibili.com/video/BV1H...

  • 设计模式(模版方法模式)

    模版方法重在一气呵成的流程。模版方法模式是以类继承的方式表现:1.模版基类,定义了方法组的调用顺序。2.对应具体类...

  • python笔记(九)类

    python3 中所有类都是继承自 object,包括 type。type 是所有类对象的模版,比如 isinst...

  • Kotlin-常用符号

    :符号、 用于类名后表示继承,用于变量后限定变量类型。 $符号、 字符串模版符号 println("item==$...

  • 设计模式之模版方法模式

    模版方法模式 模版方法是一种只需使用继承就可以实现的非常简单的模式模版方法模式由两部分结构组成,第一部分是抽象父类...

  • 设计模式之模版方法模式

    模版方法模式 模版方法是一种只需使用继承就可以实现的非常简单的模式模版方法模式由两部分结构组成,第一部分是抽象父类...

  • Django项目(四、前端技巧)

    模版的继承 为了使得Django的前端html代码可以复用, Django允许以模版形式使得html之间可以继承。...

  • 模版

    模版 模版函数 使用模版函数不需要指定类型,直接传参就可以了。 模版类 使用模版类需要指定类型。

  • 音视频开发之旅(21)运算符重载、继承、多态、模版

    目录 类和对象的重要知识点 运算符重载 继承 多态 模版 一、类和对象的重要知识点 1.1 深拷贝与浅拷贝 浅拷贝...

  • JAVA小记1

    1.JAVA是单继承,C是多继承 2.类是一个抽象模版 3.创建子类从技术角度,必须定义它本身即它已经被定义好了。...

网友评论

      本文标题:类模版继承

      本文链接:https://www.haomeiwen.com/subject/aoryvltx.html