代码如下:
#include <iostream> using namespace std; template<typename T> class Base { public: void SayHi() { T* pT = static_cast<T*>(this); pT->PrintClassName(); } protected: void PrintClassName() { cout << "This is class Base. "; } }; class D1 : public Base<D1> { }; class D2 : public Base<D2> { public: void PrintClassName() { cout << "This is class D2. "; } }; int main(void) { D1 d1; D2 d2; d1.SayHi(); d2.SayHi(); getchar(); return 0; }
在类D1中,PrintClassName方法从父类Base中继承。
PrintClassName在D1的权限是private ?
那么在实例化Base的时候,Base类调用SayHi时,无法调用D1的private方法PrintClassName的,编译应该出错。
实测中,g++和vc++编译通过,看来微软和开源届的实现是一致的。
同样在D2中,如果PrintClassName声明为protected,则编译时,g++和vc++都无法通过,因为Base实例化时无法访问D2的protected方法。
这样的代码设计思路在wtl中很常见,继续研究……