我有一个抽象类base
,带有私有成员变量base_var
。我想创建一个派生类,该派生类还具有base_var
作为私有成员。
对我来说,这似乎是您想做的一件事。 base
是抽象的,因此永远不会被实例化。我唯一会创建一个base
对象的情况是,如果它实际上是一个派生对象,那么很显然,当我给‘base’一个私有成员变量时,我真正想做的就是将该变量赋给所有对象。它的派生对象。
但是,下图似乎表明这对继承是不可行的?
为什么不呢?那么在抽象类中包含私有内容又有什么意义呢?该类永远不会被实例化,所以所有私有的东西实际上是没有用的?
答案 0 :(得分:1)
但是,下图似乎表明这对继承是不可行的?
正确的,派生类无法访问类的private
成员。如果您希望某个类的成员可以被其派生类访问,而不能被外部访问,则必须将其设为protected
。
为什么不呢?那么在抽象类中包含私有内容又有什么意义呢?该类永远不会被实例化,所以所有私有的东西实际上是没有用的?
即使抽象类也可以具有作用于(private
)成员变量的成员函数。考虑(有点愚蠢的例子,但是很好):
class MaxCached
{
private:
int cache = std::numeric_limits<int>::min();
public:
bool put(int value)
{
if (value > cache)
{
cache = value;
return true;
}
return false;
}
int get() const
{
return cache;
}
virtual void someInterface() const = 0;
};
从此类派生而来,可以为您提供基类(put
和get
)的功能,而又不会破坏基类(例如,将错误的值写入cache
)。
旁注:以上是一个纯粹的示例!您不应该在抽象基类中添加这样的缓存(与您的接口无关)。就目前而言,该示例违反了“单一责任原则”!
答案 1 :(得分:1)
我有一个带有私有成员变量base_var的抽象类库
class foo {
public:
virtual void a_pure_virtual_method() = 0;
int get_var() { base_var; }
virtual ~foo(){}
private:
int base_var;
};
请注意,如果一个类具有至少一个纯虚拟(又称为抽象)方法,则该类被称为抽象。没有什么可以禁止抽象类具有非纯虚拟甚至非虚拟方法的。
我想创建一个派生类,该派生类还具有base_var作为私有成员。
class derived : public foo {};
对我来说,这似乎是您想做的一件事。
当然,到目前为止没有问题。
我唯一创建基础对象的时间是它是否实际上是派生对象,因此很显然,当我给“ base”一个私有成员变量时,我真正想做的就是将该变量赋给它的所有变量。派生对象。
仍然可以。
为什么不呢?
您混淆了包含在映像中的访问权限,而仅包含派生成员中的成员。派生类无权访问基类中私有的成员。期。这只是根据私有的定义。
那么在抽象类中包含私有内容又有什么意义呢?该类永远不会被实例化,所以所有私有的东西实际上是没有用的?
这根本没有用。派生类继承所有成员,但是它们无法访问所有成员。那里有私人物品,您不能直接访问它。那就是封装的全部要点。考虑以下示例:
class bar : public foo {
void test() {
std::cout << base_var; // error base_var is private in foo
std::cout << get_var(); // fine
}
};
答案 2 :(得分:1)
仅仅因为类是抽象的,并不意味着该类中无法实现可能访问该变量的代码。当您在类中声明一个项目为私有时,编译器会认为您有充分的理由,并且不会因为类中只有一个纯虚函数而更改访问权限。
如果您希望派生类有权访问基类成员,则将该成员声明为受保护的
。