关于wtl的一个实验

代码如下:

#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中很常见,继续研究……

原文地址:https://www.cnblogs.com/jojodru/p/4329366.html