条款43:学会处理模板化基类内的名称

本文探讨了在C++中处理模板化基类内名称的挑战。当子类模板试图重命名从基类模板继承的方法以避免遮掩时,编译器不允许这种做法。原因是编译器要求在确定基类模板参数后才能使用继承方法。文章解释了这种设计的合理性,并提供了三种解决方案:使用`this->`前缀,使用`using`声明,或直接采用全限定名进行调用。
摘要由CSDN通过智能技术生成

1、问题引入

假如我们需要这样一个程序:它能够传递不同的信息到不同的公司去。所需要传递的信息分为两类:加密信息、未加密的文本信息。
针对上述需求我们可以采用template的解法:

  • 首先写多个公司类,类中有发送加密信息和未加密信息的方法。
  • 其次写一个信息发送类模板,其模板参数为不同的公司类。这个类用于根据模板参数向不同的公司传递信息。

2、问题升级

上述解法可以解决我们所提出的需求。但是现在,我们增加了需求。要求在发出信息后形成日志信息。我们自然而然的想法是,写一个发送信息类模板的子类模板。

这个时候,子类中的发送信息的方法应该与其父类的名称不同。这样可以避免遮掩“继承而得的名称”,也避免重新定义一个继承而得的non-virtual函数。

3、上述想法无法通过编译的原因概述

我们这个想法是合理的,但是编译的时候却通不过,这是为什么呢?
这是因为如果一个类模板B继承自一个类模板A,那么类模板B必须在在确定类模板A的模板参数的情况下,才可以使用继承而来的方法。(编译器拒绝在模板化基类中寻找继承而来的名称。)

4、C++编译为什么要这样设计呢(让上述无法通过编译)?

假如有一个公司类Z,这个公司类只允许采用加密的方法传送信息。这个时候,如果将一个公司类对象传递给类模板,模板中既有对未加密信息的传送,又有对加密信息的传送,这显然是不合理的。这个时候应该写一个特化的模板,针对特化的公司类。而C++让上述调用不能的通过编译的原因就是为了防止某些调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值