Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988572
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 16:31:00

问题的发现:
不能通过编译的代码一:

class Base
{
protected:
    
void bar()
    
{
    }

}
;

class Device: public Base
{
public:
    Device()
    
{
        Base::bar(); 
// OK
        &Base::bar; // cannot access protected member
    }

}
;

不能通过编译的代码二:

class Base
{
protected:
    Base( 
int )
    
{
    }

}
;

class Device : public Base
{
public:
    Device() : Base(
0// OK
    {
        Base b(
1); // cannot access protected member
    }

}
;

猜想:对于派生类,protected的受作用者是对象而不是类

用代码来证明:

class Base
{
protected:
    
int x;
}
;

class Device : public Base
{
public:
    
void bar( const Base* p )
    
{
        
this->x; // OK,因为 x 是本对象的
        p->x; // cannot access protected member,因为 x 不是本对象的
    }

}
;

阅读(2122) | 评论(12) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 16:32:58

YoYo
Except when forming a pointer to member(definatin bellow), the private access must be through a pointer to, reference to, or object of the derived class itself (or any class derived from that class).

A pointer to member is only formed when an explicit "&" is used and its operand is a qualified-id not enclosed in parentheses.

网友评论2012-11-23 16:32:50

shmsfi
通过对象访问的必须是public的吧,除非是在对象所在类的内部。
基类相对于派生类也应该属于不同的类吧,所以通过对象访问的也必须是public。
派生类中想引用基类的方法,要通过作用域吧,来指明是引用基类的方法。