Non-Profit, International

Spirit unsterblich.

C++ 类模板 2 - 继承,作用域运算和友元

字数统计:994 blog

本篇文章介绍 C++ 类模板的继承,作用域运算和友元。

对于一个派生类,有两种方式可以继承基类,第一种是直接指定基类中成员变量的类型,第二种是使用模板声明一个通用数据类型,再继承基类。


template <class T1>
class Base
{
public:
    T1 name;
};

class Son1 : public Base<std::string>
{
};

template <class T1, class T2>
class Son2 : public Base<T1>
{
public:
    T2 id;
    Son2(T2 i)
    {
        id = i;
    }
};

当然,如果基类有构造函数,那么也可以使用初始化列表调用基类的构造函数,参考之前的文章 C++ 构造函数初始化列表和聚合类初始化

由于类模板使用了通用数据类型,所以在类外定义成员函数也和普通类有所区别,需要加上模板参数列表(用“<>”表示):


template <class T1, class T2>
class Person
{
public:
    T1 name;
    T2 id;
    Person(T1 a, T2 b);
    void show_Name(T1 a, T2 b);
};

template <class T1, class T2>
Person<T1,T2>::Person(T1 a, T2 b)
{
    name = a;
    id = b;
}

template <class T1, class T2>
void Person<T1,T2>::show_Name(T1 a, T2 b)
{
    std::cout << name << endl;
}

友元函数是一种特殊的函数,它是普通全局函数但是同时它却有访问类的私有成员的能力。在模板类内声明友元函数和在普通类内是一样的,但是想要在类的外部声明友元函数,此时就复杂了很多。


template <class T1, class T2>
class Person
{
public:
    T1 name;
    T2 id;
    Person(T1 a, T2 b)
    {
        name = a;
        id = b;
    }
    friend void show_Id(Person &p)
    {
        std::cout << p.id << std::endl;
    }
};

int main()
{
    Person r(std::string("Tom"), 1);
    show_Id(r);
}


template <class T1, class T2>
class Person;

template <class T1, class T2>
void show_Id(Person<T1, T2>& p)
{
    std::cout << p.id << std::endl;
}

template <class T3>
void show_Id1(T3& p)
{
    std::cout << p.id << std::endl;
}

template <class T1, class T2>
class Person
{
public:
    T1 name;
    T2 id;
    Person(T1 a, T2 b)
    {
        name = a;
        id = b;
    }
    friend void show_Id<>(Person<T1, T2>& p);
    //friend void show_Id<T1, T2>(Person<T1, T2> &p);
    template <class T3>
    friend void show_Id1(T3& p);
    //friend void show_Id1<>(T3& p); 这句使用 VS2022 编译通过,但是 G++ 提示用法错误。关于空模板参数列表此处存疑,可能是由于 VS2022 不严格
};

int main()
{
    Person r(std::string("Tom"), 1);
    show_Id(r);
    show_Id1(r);
}


若无特殊声明,本文以 CC BY-SA 3.0 许可协议 提供。