2016-06-12 57 views
1
class B 
{ 
    protected: 
    int x; 
    public: 
    B(int i=28) { x=i; } 
    virtual B f(B ob) { return x+ob.x+1; } 
    void afisare(){ cout<<x; } 
}; 
class D: public B 
{ 
    public: 
    D(int i=-32):B(i) {} 
    B f(B ob) { return x+ob.x-1; } 
}; 

void test6() 
{ 
    B *p1=new D, *p2=new B, *p3=new B(p1->f(*p2)); 
    p3->afisare(); 
} 

主要调用函数test6(); 我的问题是,为什么编译器抛出一个错误,3号线,在 INT X声明,与消息:虚拟功能在被保护的变量上触发编译错误

In member function 'virtual B D::f(B)' : 
error: 'int B::x' is protected 
error: within this context 

PS:这个例子是来自考试,因此故障压痕等“泄漏“是故意的。

+3

虽然没有理由造成这个奇怪的缩进,是吗? –

回答

1

D可以访问B的成员x但只有它继承了一个。它不能访问另一个B的成员x

编辑:更正了答案。

+1

'D :: f()'可以访问'D'类型的任何对象内的'B :: x',而不仅仅是'* this'。例如,'D :: f(D other){return x + other.x - 1; ''非常好。 –

+0

@BenVoigt,谢谢,我纠正了答案。 – Inline