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