【问题标题】:Virtual function triggers compilation error on protected variable [duplicate]虚拟函数在受保护变量上触发编译错误[重复]
【发布时间】:2016-10-13 02:15:25
【问题描述】:
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();
}

main 只是调用函数 test6(); 我的问题是,为什么编译器会在第 3 行抛出错误,在 int x 声明,带有消息:

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

PS : 该示例来自考试,因此错误的压痕和其他“泄漏”是故意的。

【问题讨论】:

  • 没有理由对 SO 造成奇怪的缩进,是吗?

标签: c++ class oop virtual protected


【解决方案1】:

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

编辑:更正了答案。

【讨论】:

  • D::f() 可以在任何类型为D 的对象中访问B::x,而不仅仅是*this。例如,D::f(D other) { return x + other.x - 1; } 完全可以。
  • @BenVoigt,谢谢,我更正了答案。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 2016-01-22
  • 2017-08-05
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多