我有一个类,它有几个public
方法使用一个private
字段,他们都改变了,并在他们的计算中使用这个字段。
我需要这个类的子类,新方法很少,新方法不会使用这个字段。我希望基类中的这些方法的行为与它们相同,但是对于它们使用私有字段有点困惑。
子类中可以访问私有字段吗?我是否还应该在我的子类中声明一个具有相同类型和名称的字段?
我有一个类,它有几个public
方法使用一个private
字段,他们都改变了,并在他们的计算中使用这个字段。
我需要这个类的子类,新方法很少,新方法不会使用这个字段。我希望基类中的这些方法的行为与它们相同,但是对于它们使用私有字段有点困惑。
子类中可以访问私有字段吗?我是否还应该在我的子类中声明一个具有相同类型和名称的字段?
派生类无法访问私有成员数据。如果要访问此数据,请将其更改为受保护。用于更改私有成员的基类的公共成员函数仍可用于派生类,但不允许直接访问基类私有数据。派生类可以使用基类的所有公共和受保护字段(假设您使用公共继承)
大多数海报似乎误解了你的问题。
是的,您可以使用这些公共方法。这就是私有成员的全部意义——它们可以被同一类的任何成员访问,无论它们是公共的、受保护的还是私有的
Private
派生类永远无法访问字段。如果您将访问私有字段的方法声明为public
,则派生类可以使用它们。
在派生类成员中,您不能访问私有字段。但是,由于它们的存在而继承的基类成员public
当然仍然可以访问它。如果使用继承,则基成员函数将通过派生类可见,但如果使用继承public
,则仅对派生类可见。并且很少使用继承,但如果您使用关键字,则默认使用。protected
private
protected
private
class
为了进一步说明,如果您确实想要访问该字段,您应该在具有访问权限的基类中定义protected
访问器。这将允许您控制对私有字段的访问。
但是,您应该问自己,多态性是否是这里的正确解决方案?派生类是否通过了is-a
测试?是基类的析构函数virtual
吗?
您可以在驱动类中使用公共函数(使用私有字段)。您不应该声明具有相同类型的字段!但是您不能直接从驱动类中的基类访问私有字段。为此使用基类中的公共函数(例如 setter 和 getter 函数)
样本:
//***********************************
//Base Class
//***********************************
class Base
{
public:
Base();
~Base();
void increment();
void decrement();
void get();
private:
int id_;
};
Base::Base()
: id_(0)
{
}
Base::~Base()
{
}
void Base::increment()
{
++id_;
}
void Base::decrement()
{
--id_;
}
int Base::get()
{
return id_;
}
void Base::set(id)
{
id_ = id;
}
//***********************************
// Drived Class
//***********************************
class Drived() : public Base
{
public:
Drived();
~Drived();
void plus(int a);
void minus(int b);
};
Drived::Drived()
: Base()
{
}
Drived::~Drived()
{
}
void Drived::plus(int a)
{
int i = get();
set(i + a); // <- OK
}
void Drived::minus(int b)
{
id_ -= b; // <- Not allowd; id is private
}