0

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

我需要这个类的子类,新方法很少,新方法不会使用这个字段。我希望基类中的这些方法的行为与它们相同,但是对于它们使用私有字段有点困惑。

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

4

5 回答 5

3

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

于 2013-03-11T11:35:17.317 回答
1

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

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

于 2013-03-11T11:45:59.883 回答
1

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

于 2013-03-11T11:36:29.770 回答
0

在派生类成员中,您不能访问私有字段。但是,由于它们的存在而继承的基类成员public当然仍然可以访问它。如果使用继承,则基成员函数将通过派生类可见,但如果使用继承public,则仅对派生类可见。并且很少使用继承,但如果您使用关键字,则默认使用。protectedprivateprotectedprivateclass

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

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

于 2013-03-11T11:46:33.930 回答
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
}
于 2013-03-11T12:43:59.710 回答