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

时间:2013-03-11 11:33:57

标签: c++ oop class inheritance subclass

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

我需要这个类的子类,几乎没有新方法,新方法不会使用这个字段。我希望基类中的那些方法与它们的行为相同,但有点混淆它们使用私有字段。

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

派生类永远不能访问

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

在派生类成员中,您无法访问私有字段。但是,您通过它们public继承的基类成员当然可以访问它。如果使用public继承,则基类成员函数将通过派生类可见,但如果使用protectedprivate继承,则仅对派生类可见。 protectedprivate继承很少使用,但如果使用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
}