为什么受保护的超类成员在作为参数传递时不能在子类函数中访问? [英] Why protected superclass member cannot be accessed in a subclass function when passed as an argument?

查看:237
本文介绍了为什么受保护的超类成员在作为参数传递时不能在子类函数中访问?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到一个编译错误,我有点困惑。

I get a compile error, which I'm slightly confused about. This is on VS2003.

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

error C2248: 'A::y' : cannot access protected member declared in class '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;

The problem is with x = item.y;

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

The access is specified as protected. Why doesn't the constructor of class B have access to 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(); }
};

如果合法,您可以这样做:

If that were legal, you could do this:

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

你会调用 protected A的B成员,不允许。

And you'd be calling a protected member of A from B, which isn't allowed.

这篇关于为什么受保护的超类成员在作为参数传递时不能在子类函数中访问?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆