类模版继承

2021-08-04  本文已影响0人  Sheik

环境: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);
}
上一篇 下一篇

猜你喜欢

热点阅读