我昨天遇到了一个错误,虽然它很容易解决,但我想确保我正确理解C++.
我有一个受保护成员的基类:
class Base
{
protected:
int b;
public:
void DoSomething(const Base& that)
{
b+=that.b;
}
};
Run Code Online (Sandbox Code Playgroud)
这编译并且工作得很好.现在我扩展Base但仍想使用b:
class Derived : public Base
{
protected:
int d;
public:
void DoSomething(const Base& that)
{
b+=that.b;
d=0;
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下DoSomething仍然参考a Base,而不是Derived.我希望我仍然可以访问that.b内部Derived,但我得到一个cannot access protected member错误(MSVC 8.0 - 还没有尝试过gcc).
显然,添加一个公共getter b解决了这个问题,但我想知道为什么我无法直接访问b.我认为,当您使用公共继承时,受保护的变量对派生类仍然可见.
我想不出标题的更好的措辞,所以它有点误导,但是,我不是在谈论一个孩子访问从其父级继承的变量,这很容易.
我所说的是这个:
class Parent {
protected:
Parent *target;
int hp;
}
class Child : public Parent {
public:
void my_func();
}
void Child::my_func() {
target->hp -= 50;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试编译它,它会抱怨'hp'在这种情况下是"私有的".问题是孩子没有试图访问自己的父变量,而是其他一些类',这可能是也可能不是Child本身.
一个对象可以访问同一个类的另一个对象(内存中的两个独立实例)的所有变量和方法(公共的,受保护的或私有的),所以我认为它也适用于它,因为它继承自它试图访问的变量类,但似乎我认为这是错误的.
有小费吗?
PS不要粗鲁或任何东西,但我知道我可以创建get()和set()方法,但我希望有一个更清洁的方式.
c++ ×2