类模板与继承及成员、全局函数的实现

一、类模板与继承

当类模板碰到继承时,需要注意一下几点:

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

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

3.如果想灵活指定出父类中T的类型,子类也需变为类模板

cpp 复制代码
#include<iostream>
using namespace std;

//类模板与继承

template<class T>
class Base
{
	T m;
};

//class Son :public Base //错误,必须要直到父类中的T类型(分配内存),才能继承给子类
class Son :public Base<int>//必须指定一个类型
{
	
};

void test01()
{
	Son s1;
}

//如果想灵活指定父类中T类型,子类也需要变类模板
template<class T1,class T2>
class Son2 :public Base<T2>
{
public:
	Son2()
	{
		cout << "T1的类型为: " << typeid(T1).name() << endl;
		cout << "T2的类型为: " << typeid(T2).name() << endl;
	}
	T1 obj;
};
	
void test02()
{
	Son2<int, char>s2;
}

int main()
{
	test01();
	test02();

	return 0;
}

二、 类模板成员函数类外实现

cpp 复制代码
#include<iostream>
using namespace std;
#include<string>

//类模板成员函数类外实现
template<class T1, class T2>
class Person
{
public:
	Person(T1 name, T2 age);//类内声明
	//{
	//	this->m_Name = name;
	//	this->m_Age = age;
	//}

	void showPerson();//类内声明
	//{
	//	cout << "姓名: " << this->m_Name << " 年龄: " << this->m_Age << endl;
	//}

	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 test()
{
	Person<string, int>P("Tom", 20);
	P.showPerson();
}

int main()
{
	test();

	return 0;
}

总结:类模板中成员函数类外实现时,需要加上模板参数列表

三、类模板全局函数的类内类外实现

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

全局函数类外 实现 - 需要提前让编译器知道全局函数的存在

cpp 复制代码
#include<iostream>
using namespace std;
#include<string>

//通过全局函数来打印 Person 信息

//提前让编译器知道 Person 类的存在
template<class T1, class T2>
class Person;				

//类外实现	函数模板的实现
template<class T1, class T2>
void printPerson2(Person<T1, T2>p)
{
	cout << "类外实现---姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;
}

template<class T1,class T2>
class Person
{
	//全局函数 类内实现
	friend void printPerson1(Person<T1, T2>p)
	{
		cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;
	}
	 
	//全局函数 类外实现(类内声明,类外实现)
	//加空模板参数列表--->函数模板的声明
	//如果全局函数是类外实现,需要让编译器提前知道这个函数的存在
	friend void printPerson2<>(Person<T1, T2>p);无尖括号则为普通函数的声明

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

private:
	T1 m_Name;
	T2 m_Age;
};

//1.全局函数在类内实现
void test01()
{
	Person<string, int>p("Tom", 18);
	printPerson1(p);
}

//2.全局函数在类外实现
void test02()
{
	Person<string, int>p("Jerry", 18);
	printPerson2(p);
}

int main()
{
	//test01();
	test02();

	return 0;
}

总结:建议全局函数做类内实现,用法简单,而且编译器可以直接识别

相关推荐
白帽攻防录6 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛6 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
2603_965148117 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
所以遗憾是什么呢?7 小时前
【题解】Educational Codeforces Round 195 (Rated for Div. 2) ABCDE
c++·动态规划·acm·icpc·ccpc·xcpc·codeforecs
xixiaoyunya7 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的8 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务8 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
Lhan.zzZ9 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
打工仔折腾 AI10 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问10 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab