c++ 为参数传递时,为什么不能在子类函数中访问受保护的超类成员?

我得到一个编译错误,我有点困惑.这是在VS2003.

错误C2248:’A :: y’:无法访问在类’A’中声明的受保护成员

class A
{
public:
  A() : x(0), y(0) {}
protected:
  int x;
  int y;
};

class B : public A
{
public:
  B() : A(), z(0) {}
  B(const A& item) : A(), z(1) { x = item.y;}
private:
  int z;
};

问题在于x = item.y;

访问被指定为受保护的.为什么B类的构造函数不能访问A :: y?

最佳答案
正因为如此:

class base_class
{
protected:
    virtual void foo() { std::cout << "base::foo()" << std::endl; }
};

class A : public base_class
{
protected:
    virtual void foo() { std::cout << "A::foo()" << std::endl; }
};

class B : public base_class
{
protected:
    virtual void foo() { std::cout << "B::foo()" << std::endl; }

public:
    void bar(base_class *b) { b->foo(); }
};

如果这是合法的,你可以这样做:

A a;
B b;
b.bar(&a);

而且你会打电话给B的受保护的成员,这是不允许的.

转载注明原文:c++ 为参数传递时,为什么不能在子类函数中访问受保护的超类成员? - 代码日志