Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988500
  • 博文数量: 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 不是本对象的
    }

}
;

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

网友评论2012-11-23 16:34:34

benbenzhu
呵呵,星星是不是忽略了一点呀。我的理解是像这种成员访问控制只适用于继承链,继承链以外的情形按常规处理。如你列出的第1例中,虽有两个Base,但却意义不同。第一个Base是明确表示对基类符号的访问,涉及到,继承间的成员访问控制在这里被应用;每二个Base显然和继承没有关系,按常规访问控制方式处理。每二、第三例也都一样,也就不多说了。我觉得这种成员访问控制为什么有这种局限是有一定的道理的,我举个反面的例子: class base { public: int x; }; class derived : private base { }; class derived_derived : public derived { void foo() { &base::x; // 如果将继承链中的成员访问控制应用于此,此行是否合法呢? } };

网友评论2012-11-23 16:34:26

上面的人
//噢,复制你的代码进行修改,关键注释也得改一下,
//以免误解
class Base
{
public:
    virtual ~Base() {} //for dynamic_cast<>
protected:
    int x;
};

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

        if (

网友评论2012-11-23 16:34:11

第4次纠正星星

"protected的受作用者是对象而不是类?(应该不对)"呵,当然不对。

protected 也好,private,public也好,三者的“受作用者”(借用你的词),都是类。

bz聪明一世胡涂一时,虽然我们常说一个 Device  Object is a Base Object。。。那显然一个“Device” Type 不是一个“Base” Type。。。“受作用者”是class没错,但必须是完完全全同样的class,派生的类也不行。看下面的这个粗暴的代码,你就懂了,这样粗暴以后,就完全可以通过编译了:

class Base
{
public:
    virtual ~Base() {} //for dynamic_cast<>
protected:
    int x

网友评论2012-11-23 16:33:57

100000
标准上说除非是为了形成一个pointer to member,否则对基类中受保护乘员的访问才必须通过所谓的子类的指针,引用,或对象.
而&B::i不正是标准上所说的那个例外(pointer to member) 吗?  "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:33:49

xiaoMa
指向成员变量的指针和 指向成员函数的指针都不是指针,参见 C++ common knowledge  item 15   、item16