c++ learning -- template 泛型编程

参考书籍:effective c++ 条款43

面向对象编程:显示接口 + 运行时多态(哪一个virtual函数被绑定 - 发生在运行期)

泛型编程       :隐式接口 + 编译时多态 (哪一个重载函数被调用 - 发生在编译期)

 

template注意点1:

子类不能顺利的调用模板化基类的函数

Example:


#include<iostream>
class CompanyA {
public:
	void SendClear() {};
	void SendSecret() {};
};

class CompanyB {
public:
	void SendClear() {};
	void SendSecret() {};
};
class CompanyC {
public:
	void SendSecret() {};
};
template<typename Company>
class MsgSender {
public:
	void SendClearMsg() {
		Company c;
		c.SendClear();
	}
};

template<typename Company>
class LogMsgSender :public MsgSender<Company> {
public:
	void Log() {
		std::cout << "Loging..." << std::endl;
	}
	void LogSendClearMsg() {
		Log();
		SendClearMsg();
	};
};

int main() {

	LogMsgSender<CompanyA> logMsgSender;
	logMsgSender.LogSendClearMsg();
	std::cin.get();
}

编译出错:

问题在于:当编译器遇到LogMsgSender类时,并不知道它继承的是什么样的class ,在LogMsgSender被具现化(instantiated)之前无法知道Company是什么--更确切的说是没办法知道Company是否有个SendClear函数!(比如CompanyC就没有)

编译器往往拒绝在 templatized base class(模板化基类,Example中的MsgSender<Company>)中寻找继承而来的方法!

解决方法:

1.在 base class 函数调用之前加上this->

template<typename Company>
class LogMsgSender :public MsgSender<Company> {
public:
	void Log() {
		std::cout << "Loging..." << std::endl;
	}
	void LogSendClearMsg() {
		Log();
		this->SendClearMsg();
	};
};

2.使用using声明:

template<typename Company>
class LogMsgSender :public MsgSender<Company> {
public:
	using MsgSender<Company>::SendClearMsg;
	void Log() {
		std::cout << "Loging..." << std::endl;
	}
	void LogSendClearMsg() {
		Log();
		SendClearMsg();
	};
};

运行成功:

Loging...

template 注意点2:

class templates 的成员函数只有在被使用时才被具现化。

比如:一个template具现化20个类,每个类15个成员函数,只有在这300个函数的每一个都被使用,你才会获得这300个函数!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值