我有一个类,它有几个public
方法使用一个private
字段,它们都已更改并在计算中使用此字段。
我需要这个类的子类,几乎没有新方法,新方法不会使用这个字段。我希望基类中的那些方法与它们的行为相同,但有点混淆它们使用私有字段。
子类中是否可以访问私有字段? 我是否还要在子类中声明一个具有相同类型和名称的字段?
答案 0 :(得分:3)
派生类无法访问私有成员数据。如果要访问此数据,请将其更改为protected。用于更改私有成员的基类的公共成员函数仍可供派生类使用,但不允许直接访问基类私有数据。基类的所有公共和受保护字段都可用于派生类(假设您使用公共继承)
答案 1 :(得分:1)
Private
个字段。如果您将访问私有字段的方法声明为public
,则派生类可以使用它们。
答案 2 :(得分:1)
大多数海报似乎都误解了你的问题。
是的,您可以使用这些公共方法。这是私人成员的全部意义 - 他们可以被同一类的任何成员访问,无论是公开的,受保护的还是私人的
答案 3 :(得分:0)
在派生类成员中,您无法访问私有字段。但是,您通过它们public
继承的基类成员当然可以访问它。如果使用public
继承,则基类成员函数将通过派生类可见,但如果使用protected
或private
继承,则仅对派生类可见。 protected
和private
继承很少使用,但如果使用class
关键字则默认使用。
为了进一步说明,如果您确实想要访问该字段,则应在基类中定义具有protected
访问权限的访问者。这将允许您控制对私有字段的访问。
但是,您应该问自己多态是否是正确的解决方案?派生类是否通过is-a
测试?是基类的析构函数virtual
?
答案 4 :(得分:0)
您可以在您驾驶的课程中使用公共功能(使用私人字段)。 你不应该声明一个相同类型的字段!! 但是你不能直接从被驱动的类中的基类访问私有字段。用于此基类的公共函数(例如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
}