《Effective C++》中的一处疑问

  期中考试在即,百忙之中还是抽出时间来发一篇博文。

  这段时间又看了下《Effective C++》的后几款,发现了一个小问题。说的不谦虚点,我认为这个应该算是错误。

  主要是集中在33,43和44,这三款,这里面主要涉及的是函数的隐藏,模板类的继承以及如何在子类中调用模板基类的函数,涉及到的关键字是using,this。

  我大概讲述下我的理解方式:

    1.(33款)使用using能够将基类的函数引进子类,这点毋庸置疑;

    2.(43款)使用"this->"调用函数能够解决编译器不检查模板化基类内函数的问题,这里有概念性错误,稍后介绍;

    3.(43款)使用using能够实现像2中提到的效果,的确可以,但是原文中提到,这里using的作用其实和1是不一样的;

  综合上述3点,引出了44款P214 最后一段中的一个大错误,首先这一段与43款中描述的就不符,我更愿意相信这个是原作者的笔误而不是翻译的问题(我还是非常认可侯捷老师的翻译质量的)。下面是相关源代码与原文:

template<typename T>
class SquareMatrixBase{
protected:
  ...
  void invert(std::size_t matrixSize);
  ...
};
template<typename T,std::size_t n>
class SquareMatrix: private SquareMatrixBase<T>{
private:
  using SquareMatrixBase<T>::invert;
public:
  ...
void invert(){ this->invert(n); }
};

  原文:“这里的函数使用"this->"记号,因为若不这样做,便如条款43所说,模板化基类内的函数名称会被derived classes 掩盖。

  首先,43款并为有上述的内容,33款中有提到,但是只是介绍了"using"和"::"来解决问题,"this->"并未涉及。其次,在43款中能够使用"this->"只是一种特殊情况,因为那个类中并没有申明与 基类中(函数) 同名的函数,因此这里使用"this->"的确做到了告诉编译器:“我这儿应该出现这么一个函数的,你不能吞没它,我需要你去检查基类”,但是假如子类中本身就有那么一个名字的函数呢?(隐藏和参数无关)那么你只使用"this->"就行不通了,因为编译器向你抱怨了:“你本身就有名字符合的函数,我有隐藏机制,你懂的”,当然这里可以使用"::"来解决问题,但是这个函数的调用就将会失去多态性。那么我们只能使用"using","using"可以将基类中的同名函数引入子类,同时它无疑也向编译器保证了模板化基类中有这个函数。好,既然using解决了“隐藏”和“检查”的问题,那么此处的"this->"是做什么用的?我认为这是多此一举。作者竟然还说明了不这么做的后果,我甚是好奇,为什么作者会这么说,或者说是为什么会出现这种错误?

  后来我发现他可能是倒着思考的。。。

  我是先看到了using,好,它解决了一切的问题,不用"this->"了。

  但是作者可能是先安排了"this->",这个时候如果不用using,那编译器就该抱怨了,因此他又添上了using,却不知using其实是带有附加效果的。

  我一直想不明白“因为若不这样做,模板化基类内的函数名称会被derived classes掩盖”是怎么得出来的。

  另外,书上的代码是能够通过编译的,去掉"this->"后的代码也能通过编译,结果运行正确。测试编译器TDM4.7.1

你可能感兴趣的:(C++,C++,effective)