template之类相关

本文探讨了模板和虚函数的结合使用,指出虚函数不能是模板函数的原因,因为编译器在编译阶段必须确定类的虚表大小,而模板的实例化则在运行时。此外,介绍了模板拷贝构造函数,它是通过修改类的构造函数以支持不同模板类型的对象间转换,实现了类似强制转换的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前面两节主要分析了使用template的注意点以及非类型参数如何使用, 本节来探讨虚模板函数和模板拷贝构造函数.

虚函数模板

在我们使用模板从来都没有将虚函数与模板进行套用, 那么这两者能不能同时连用呢?

这个直接来写代码验证才知道.

class point
{
	public:
		template<class T>
			virtual T getX()
			{
				return x;
			}
	private:
		int x;
};

int main()
{
	exit(0);
}

分别用了g++clang编译

// g++
virtual_template.cpp:17:4: error: templates may not be ‘virtual’
    virtual T getX()
// clang
virtual_template.cpp:17:4: error: 'virtual' cannot be specified on member function templates
                        virtual T getX()

可以看出来clang更加准确的指出了virtual不能是member function templates.

为什么虚函数不能是模板函数?

  • 编译器在编译类的定义的时候就必须确定该类的虚表大小.
  • 模板只有在运行调用时才能确认其大小, 两者冲突. 结果显而易见.

模板拷贝构造函数

模板与不同模板之间不能直接的赋值(强制转换), 毕竟模板一般都是类和函数都不是普通的类型. 但是类有拷贝构造函数, 所以我们可以对类的构造函数进行修改, 也就成了模板构造函数.

模板拷贝构造函数与一般的拷贝构造函数没有什么区别, 仅仅实在加了一个模板作为返回值类型

template<class T>
class tmp
{
	public:
		tmp() : x(0) {}
		template<class U>
			tmp(const tmp<U>& t)
			{
				x = t.x;
			}
	private:
		T x;
};

int main()
{
	tmp<int> t1;
	tmp<char> t2;
	t1 = t2;

	exit(0);
}

总结

本节分析了类的虚表大小要在编译时知道其大小所以虚函数不能为模板函数, 模板构造函数与普通的构造函数写法无意, 并且可以实现强制转换的效果.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值