首页 > 其他分享 >模板——类模板2——继承,文件,友元

模板——类模板2——继承,文件,友元

时间:2024-07-16 13:28:41浏览次数:12  
标签:友元 函数 继承 age Person 类外 模板 name

1.类模板与继承

1.1当子类继承的父类是一个类模板时,子类在声明时,要指定父类中T的类型

1.2如果不指定,编译器无法给子类分配内存

1.3如果想灵活指定父类中的T的类型,子类也需变成类模板

template<class T>
class Base
{
public:
	T age;
};
//class Son :public Base//错误,c++编译器分配内存时必须知道父类中的T的类型
class Son1 :public Base<int>//父类为模板,子类继承时必须指定父类模板的类型
{
public:

};
template<class T1,class T2>
class Son2 :public Base<T2>//类模板继承类模板可以用T2指定父类中的T类型
{
public:
	Son2()
	{
		cout << typeid(T1).name() << endl;
		cout << typeid(T2).name() << endl;
	}
};
void test01()//普通类继承类模板
{
	Son1 p1;
}
void test02()//类模板继承类模板
{
	Son2<int,string> p2;
}

2.类模板成员函数的类外实现

类模板成员函数类外实现时需要加上模板参数列表

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;
}
void test01()
{
	Person<string, int>p1("张三", 10);//指定NameType为string,AgeType为int
	p1.ShowPerson();
}

3.类模板份文件编写

问题:类模板成员函数创建时机是在调用阶段,导致分文件编写时链接不到

解决:1.直接包含.cpp文件

        2.将函数声明和函数实现编写到一个文件里并更改后缀名为.hpp。(后缀名不是强制)

 

 4.类模板与友元

4.1全局函数类内实现,直接在类内声明友元即可

4.2全局函数类外实现,需要提前让编译器知道函数的存在(函数实现写在类的前面)

template<class T1, class T2>class Person; //全局函数类外实现(类声明)

template<class T1, class T2>
void Print_person2(Person<T1, T2> p)//全局函数类外实现(类外实现)//没声明全局函数模板,函数实现写在类的前面
{
	cout << "全局函数类外实现--姓名:" << p.m_name << "年龄:" << p.m_age << endl;
}
//如果声明了全局函数模板,可将实现写在类的后面
//template<class T1, class T2>void Print_person2(Person<T1, T2>& p);//全局函数模板声明

template<class T1, class T2>
class Person
{
	friend void Print_person1(Person<T1, T2> p)//全局函数类内实现
	{
		cout << "全局函数类内实现--姓名:" << p.m_name << "年龄:" << p.m_age << endl;
	}
	friend void Print_person2<>(Person<T1, T2> p);//全局函数类外实现(类内声明)//!!!注意这里的声明要加空模板参数列表,呜呜呜

public:
	Person(T1 name, T2 age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	T1 m_name;
	T2 m_age;
};
//配合友元实现全局函数类内实现
void test01()
{
	Person<string, int>p1("张三", 10);
	Print_person1(p1);
}
//配合友元实现全局函数类外实现
void test02()
{
	Person<string, int>p2("李四", 15);
	Print_person2(p2);
}

总结:全局函数配合类内实现,用法简单,编译器也可直接识别

标签:友元,函数,继承,age,Person,类外,模板,name
From: https://blog.csdn.net/weixin_74207910/article/details/140444446

相关文章

  • 模板——类模板1--与函数的关系
    1.类模板基本语法template<classT,classT2>类template<classNameType,classAgeType>classPerson{public: Person(NameTypename,AgeTypeage) { this->m_name=name; this->m_age=age; } voidShowPerson() { cout<<"姓名:&quo......
  • 类模板案例——数组类封装(vector<>的逻辑代码)
    .hpp文件#pragma#include<iostream>usingnamespacestd;template<classT>classMy_arry{public: My_arry(intcapacity)//赋初值 { this->m_capacity=capacity;//容量 this->m_Arry_size=0;//大小 this->m_Arry_Addres=newT[capacity];......
  • DedeCMS网站模板的title、description、keywords应该怎么写?
    首页​<title>{dede:global.cfg_webname/}-{dede:global.cfg_websubtitle/}</title><metaname="description"content="{dede:global.cfg_description/}"><metaname="keywords"content="{dede:global.cfg_k......
  • 模板——函数模板的基本语法和调用规则
    1.模板函数    1.1分为自动类型堆到和显示指定类型template<classT>voidSwapNum(T&a,T&b){ Ttemp=a; a=b; b=temp;}voidtest01(){ inta=10; intb=20; doublec=30.5; doubled=40.8; SwapNum(a,b);//自动类型推导 SwapNum<in......
  • C#基础:partial关键字和类的继承
    代码示例publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}//Button的Click点击事件(自动添加)privatevoidshowMessage(objectsender,EventArgse){MessageBox.Show("HelloWorld!");}......
  • 易优CMS模板标签articlepay文章付费
      [基础用法]  标签:articlepay   描述:文章模型实现文章付费阅读,会员专享,会员付费,在使用之前先在文章模型开启付费阅读  属性:   aid=''文档id   id=''可以任意指定循环里的变量名替代c_field,假设id='c_field',模板调用如:{$c_field.hidden}变成 {$c_fiel......
  • 基于Go1.19的站点模板爬虫
    一、go语言简介Go(也被称为Golang)是一种开源的编程语言,由Google公司于2007年开始开发,并在2009年对外公开发布。Go语言的设计目标是提供一种简单、高效、安全的编程语言,适合并发编程和网络编程。以下是Go语言的一些特点和优势:简单易学:Go语言的语法简洁明了,只有25个关键字,......
  • 二分查找模板
    二分查找主要难点在于边界判定,逻辑相对简单,下文以力扣704.二分查找为例分析二分查找的代码模板。题目描述给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。来源:力扣(LeetCode)原......
  • 快速排序模板及其理解
    快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:原理:快速排序的解决分为两个部分,分区(partition)和递归(recurse)。分区是主要进行排序的功能,递归用于控制分区的次数。分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理......
  • 面向2-封装、继承、多态
    封装、继承、多态继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模extands关键字扩展封装/*封装-隐藏内部信息,通过接口访问1、“高内聚,低耦合”-该露的露,该藏得藏属性私有,get/set2、提高程序的安全性,保护数据3、隐藏代码的实现细节4、统一接口5、提高系统的......