2012年(158)
分类: C/C++
2012-11-23 16:31:00
问题的发现:
不能通过编译的代码一:
不能通过编译的代码二:
猜想:对于派生类,protected的受作用者是对象而不是类
用代码来证明:
网友评论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: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. "
如果不是那哪样的应用才是标准所说的那个例外呢?
谢谢!