使用使用私有字段的基类方法
using base class methods that use private field
我有一个类,它有几个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
继承,基成员函数将通过派生类可见,但如果使用protected
或private
继承,则只能对派生类可见。很少使用protected
和private
继承,但如果使用class
关键字,则默认使用。
为了进一步澄清,如果您确实想访问该字段,您应该在基类中定义具有protected
访问权限的访问器。这将允许您控制对private字段的访问。
但是,您应该问自己多态性在这里是否是正确的解决方案?派生类是否通过了is-a
测试?基类的析构函数是virtual
吗?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C++初始化之前派生类调用基类的方法
- 为什么派生类的实例从基类调用方法?
- 为什么允许将派生类的方法static_cast为基类的方法?
- 从基类调用继承类的方法.C++
- 我无法重写基类的方法,因为我的派生类是模板化的
- C++继承,如何在基类的方法中调用子类的方法?
- C ++中有没有办法让派生类重写基类静态方法
- 如何将模板派生类的方法提取到非模板基类中
- 将指针从派生到基类的方法的最佳方法
- 当类不需要重写从多个基继承的方法时该怎么办
- 抽象基类的派生类未正确覆盖基纯虚拟方法
- C++抽象基模板类非空方法
- CRTP:基于派生类内容的基类启用方法
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包
- SWIG:在派生类中处理基类重载方法
- 在派生类的方法中使用基类的方法
- 仅通过基类"create"方法将对象创建为共享指针