class D2 : public B1<D2>
{
public:
    void PrintClassName() { cout << "This is D2"; }
};改成 public 就OK

解决方案 »

  1.   

    我的意思是说为protected为什么不行?
    class base
    {
    public:
    void call()
    {
    vfunc();
    }
    protected:
    virtual void vfunc()
    {
    cout << "Call base::vfunc() "<< endl;
    }
    };class derive: public base
    {
    protected:
    virtual void vfunc()
    {
    cout << "Call derive::vfunc() " << endl;
    }
    };int main()
    {
    base* p = new derive;
    p->call();
    return 0;
    }
    不也能通过,加了模板为什么会原先的语法也改了
      

  2.   

    T* pT = static_cast<T*>(this);
    pT->PrintClassName();
    等于在类外部调用 PrintClassName();
    这个 pT->PrintClassName(); 中的 PrintClassName() 不是类体系中的 PrintClassName()
      

  3.   

    class D2 : public B1<D2>
    {
    friend class B1<D2>; // 加上这一句
    protected:
        void PrintClassName() { cout << "This is D2"; }
    };因为B1要调用D2的PrintClassName函数,函数是protected,只有D2的派生类或友元才能访问。
      

  4.   

    LZ的使用方式是两种不同的使用方式.
    一种是虚函数,这种方式是覆盖.
    另一种方式没有使用虚函数,这种方式是隐藏.
    而protected是对起子类是可见,但子类的protected对父类来说是不可见的.
      

  5.   

    而protected是对起子类是可见,但子类的protected对父类来说是不可见的.
    这句话很关键,你的基类的函数被覆盖,而基类的成员要用到子类成员函数,protected对他并不可见.