使用使用私有字段的基类方法

using base class methods that use private field

本文关键字:基类 类方法 字段      更新时间:2023-10-16

我有一个类,它有几个public方法,使用一个private字段,它们都改变了,并在计算中使用这个字段。

我需要这个类的子类,有几个新方法,新方法不会使用这个字段。我希望那些来自基类的方法的行为与它们一样,但是它们使用私有字段有点令人困惑。

私有字段是否可以在子类中访问?我也应该声明一个字段与相同的类型和名称在我的子类?

私有成员数据不能被派生类访问。如果您想要访问这些数据,请将其更改为protected。用于更改私有成员的基类的公共成员函数仍然对派生类可用,但不允许直接访问基类私有数据。基类的所有公共和受保护的字段将对派生类可用(假设您使用公共继承)

Private字段永远不能被派生类访问。如果您将访问私有字段的方法声明为public,则派生类可以使用它们。

大多数海报似乎误解了你的问题。

是的,你可以使用那些公共方法。这就是私有成员的全部意义——它们可以被同一类的任何成员访问,无论它们是public、protected还是private

您可以在您的驱动类中使用公共函数(它使用私有字段)。你不应该声明相同类型的字段!!但是,您不能从驱动类中的基类直接访问私有字段。使用基类中的公共函数(例如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
}

在派生类成员中,不能访问private字段。但是,基类成员(由于它们是public而继承的)当然仍然可以访问它。如果使用public继承,基成员函数将通过派生类可见,但如果使用protectedprivate继承,则只能对派生类可见。很少使用protectedprivate继承,但如果使用class关键字,则默认使用。

为了进一步澄清,如果您确实想访问该字段,您应该在基类中定义具有protected访问权限的访问器。这将允许您控制对private字段的访问。

但是,您应该问自己多态性在这里是否是正确的解决方案?派生类是否通过了is-a测试?基类的析构函数是virtual吗?