`

MFC程序员的WTL指南的第一个例子解释

阅读更多
#include "stdafx.h"

#include "iostream.h"

template <class T>
class B1
{
public: 
    void SayHi() 
    {
        T* pT = static_cast<T*>(this);   // HUH?? 我将在下面解释
 
        pT->PrintClassName();
    }
protected:
    void PrintClassName() { cout<<"This is B1"; }
};
 
class D1 : public B1<D1>
{
    // No overridden functions at all
};
 
class D2 : public B1<D2>
{
protected:
    void PrintClassName() { cout<<"This is D2"; }
};
 
int main(int argc, char* argv[])
{
    D1 d1;
    D2 d2;
 
    d1.SayHi();    // prints "This is B1"
    d2.SayHi();    // prints "This is D2"
	return 0;
}

 但是这个编译不通过,提示如下:
: error C2248: 'D2::PrintClassName' : cannot access protected member declared in class 'D2'

 

网上找的这个解释如下:

基础问题:父类调用子类没法按照继承关系来处理,在编译器看来,它们就是两个相互独立的类/对象,所以是不可以访问“其它”类的保护成员的。
反过来,子类调用父类的,则适用继承关系。

这里的干扰点是:以为模板可以把这种继承关系传递给父类。其实不然,模板只是节约了我们的代码量,可不负责把继承关系到处传递。

 

 其实这个错误,注是访问权限的问题,类中的成员函数,可以访问类中的其他成员函数

例1:

class B1
{
public: 
    void SayHi() 
    {
         PrintClassName();
    }
protected:
    void PrintClassName() { cout<<"This is B1"; }
};

 

 例2

class B1
{
public: 
    void SayHi() 
    {
         this->PrintClassName();
    }
protected:
    void PrintClassName() { cout<<"This is B1"; }
};

 

例3

 

class B1
{
public: 
    void SayHi() 
    {
		this->B1::PrintClassName();
    }
protected:
    void PrintClassName() { cout<<"This is B1"; }
};

 

例1,例2,例3是一样的,类中的SayHi()要访问到类中的PrintClassName() 函数,是通过this来访问的,要求this能够访问到B1::PrintClassName()函数,也就是说类中的SayHi()要访问到类中的PrintClassName() 函数,this指针并不是唯一的途径,只要这个指针(例如pT)能够访问到B1::PrintClassName()函数就行了,就是这个指针(例如pT)能够可见到B1::PrintClassName()函数.

   d1.SayHi();  是的形式是这样的pT->PrintClassName();相当于(D1的指针)->B1::PrintClassName();D1的指针能够访问得到B1::PrintClassName();所以编译会通过

 

d2.SayHi(); 是的形式是这样的pT->PrintClassName();相当于(D2的指针)->D2::PrintClassName();

而D2与B1是两个不同的类,在B1类中 当然不能访问到D2是的保护成员函数了,所以报错了.

 

 

 

这个例子,是编译时多态的例子.

分享到:
评论

相关推荐

    MFC程序员的WTL指南+程序+示例

    MFC程序员的WTL指南+程序+示例

    MFC程序员的WTL指南.pdf

    《MFC程序员的WTL指南》这一文档深入探讨了Windows Template Library(WTL)作为Microsoft Foundation Classes(MFC)替代方案的角色与优势。WTL是一个轻量级的、高效的类库,专为Windows应用程序开发而设计,尤其...

    MFC程序员的WTL指南+例子

    **MFC程序员的WTL指南+例子** 在IT领域,MFC(Microsoft Foundation Classes)和WTL(Windows Template Library)都是微软提供给开发者用于构建Windows应用程序的库。本指南主要面向已经熟悉MFC的程序员,旨在帮助...

    MFC程序员的WTL指南 (第二版)

    《MFC程序员的WTL指南 (第二版)》是一本专为熟悉Microsoft Foundation Class (MFC)库的程序员设计的指南,旨在帮助他们理解和掌握Windows Template Library (WTL)。WTL是微软提供的一种轻量级、高性能的库,用于构建...

    MFC程序员的WTL指南

    标题“MFC程序员的WTL指南”指向了一个特定的技术路线探索:即通过WTL(Windows Template Library)为MFC(Microsoft Foundation Classes)程序员提供一种新的开发选择。MFC作为一套老旧的C++库,在提供功能强大的...

    MFC程序员的WTL指南PDF版(中文) 【WTL指南】

    该指南旨在帮助MFC程序员学习和使用WTL,提供了详细的教程和示例代码。 1. WTL 简介 WTL 是一个开源的库,由微软公司开发,提供了一个功能强大且灵活的框架,用于构建Windows应用程序。WTL 的主要特点是使用模板来...

    MFC程序员的WTL指南(中文版)

    **MFC程序员的WTL指南**是一本专为已熟悉MFC的开发者准备的书籍,旨在帮助他们过渡到WTL开发环境。书中可能涵盖了以下内容: 1. **WTL基础**:介绍WTL的基本结构和设计原则,包括窗口类、消息映射、命令路由等概念...

    MFC程序员的WTL开发指南(第二版)

    **MFC程序员的WTL开发指南(第二版)** MFC(Microsoft Foundation Classes)和WTL(Windows Template Library)是两种由微软提供的C++库,用于构建Windows应用程序。本指南针对已经熟悉MFC的程序员,旨在帮助他们...

    MFC程序员的WTL指南 第二版[CHM]

    珠穆朗玛 译的 MFC程序员的WTL指南 第二版 CHM 格式文件

    MFC程序员的WTL指南 (第二版).rar

    **MFC程序员的WTL指南**,作为一本专为MFC开发者设计的教程,旨在帮助他们快速掌握WTL,并将其融入到已有的MFC知识体系中。第二版通常会包含更多的更新、修正和新增内容,以适应技术的快速发展和变化。 该指南可能...

    mfc程序员的wtl指南 wtl指南

    《mfc程序员的wtl指南》是一份专为MFC(Microsoft Foundation Classes)开发者准备的珍贵资源,旨在帮助他们理解和掌握WTL(Windows Template Library)。WTL是微软提供的一套C++库,它允许开发者更高效地编写轻量级...

    MFC程序员的WTL开发指南PDF

    ### MFC程序员的WTL开发指南 #### 一、引言 随着软件开发技术的不断进步,Microsoft Foundation Classes (MFC) 和 Windows Template Library (WTL) 成为了Windows平台上进行高效快速开发的重要工具。《MFC程序员的...

    MFC程序员的WTL指南.rar

    不错的书,替代mfc的一个包装api的类库

    MFC程序员的WTL指南 (第二版) 【CHM】

    MFC程序员的WTL指南 (第二版)珠穆朗玛翻译 CHM 格式

    MFC程序员的WTL指南(第二版).chm

    MFC程序员的WTL指南(第二版).chm,WTL教程指南

    MFC程序员的WTL指南(含演示程序)

    本资源是VC知识库中一些关于VC中关于WTL与ATL的开发指南,资料比较系统的介绍了WTL与ATL的知识,为想在这方面开发的程序员提供学习资料,并且作者还提供演示程序。本人只是从VC知识库中复制粘贴下来,对文档进行一定...

    MFC程序员的WTL指南 (第二版).chm

    《MFC程序员的WTL指南 (第二版).chm》是一部专为已熟悉Microsoft Foundation Class (MFC)库的开发者准备的指南,旨在帮助他们掌握Windows Template Library (WTL)。WTL是微软提供的一种轻量级、高效的库,用于构建...

Global site tag (gtag.js) - Google Analytics