我可以在派生类中继承私有成员吗?
Can I subclass private members in a derived class?
我有一个基本数据成员类:
class DataClass {
}
和子类:
class DerivedDataClass : public DataClass {
}
我使用DataClass作为类DataClassList的私有成员
class DataClassList {
public:
// some useful functions here
private:
DataClass private_data;
}
我想子类化DataClassList来创建一个类,可以对DerivedDataClass操作
class DerivedDataClassList : public DataClassList {
// how do i get this class to use DerivedDataClass as the private member?
}
这可以在c++中以某种形式完成吗?
编辑:添加更多关于我正在尝试做的事情的注释:
DataClass
有一些有用的函数,我不想在DerivedDataClass
中重新定义,DerivedDataClass
有自己的函数。所以,继承是有意义的。到目前为止一切都很好。
下一层才是问题所在。DataClassList
具有依赖于DataClass
函数的有用函数。DerivedDataClassList
将需要从DerivedDataClass
访问数据/运行函数,除了基类提供的有用函数。
如果不能将DataClassList
中的私有DataClass
成员更改为DerivedDataClass
,则无法从DerivedDataClassList
中调用DerivedDataClass
中的函数。
基本上,你没有。Private的意思是私有的——它只属于那个类。正确的方法是使用访问器函数。
如果这个类访问那个成员有一个特殊的要求,那么它应该被保护[然而,这是一个相当愚蠢的概念,因为它根本没有提供任何保护——任何想要访问那个字段的人都只需要从这个类派生,瞧,他们有自由访问权]。
感谢jogojapan指出我错过了一点。使用模板是一种解决方案。另一种方法是在基类中使用指针,然后让一个访问器函数将private_data
设置为所提供的类成员。哪个是"正确的"取决于你想做什么。例如,如果它是某种类型的元素列表(例如图形对象(Window, Menu等)或游戏对象),并且你实际上希望它们是一个列表[或几个类似的列表],那么使用指针是正确的解决方案。如果您有几种不同的、不同类型的对象,而这些对象从未以一种常见的方式使用过,那么模板类可能是正确的选择。
一旦您为此使用继承,您将从基类获得private_data
成员作为派生类的成员,尽管是不可访问的成员。不能在派生类中更改基类成员的数据类型。
我相信在你的情况下使用类模板更好:
template <typename Data>
class DataClassList
{
public:
/*...*/
private:
Data private_data;
};
您只需要编写上面的定义一次,但是您可以像下面这样创建实例:
DataClassList<DataClass> standard_list;
DataClassList<DerivedDataClass> derived_list;
前者是包含DataClass
成员的对象,后者是包含DerivedDataClass
成员(不包含其他成员)的对象。
我假设你想在DerivedDataClassList
中使用DataClass
对象private_data
。如果你想使用DerivedDataClass
,那么你需要在某个地方声明一个DerivedDataClass
的对象(我在任何地方都没有看到DerivedDataClass
的对象)。或者你需要从DerivedDataClass
继承-我再次在你的代码中没有看到。
class DataClassList
{
protected:
DataClass private_data;
};
class DerivedDataClassList : private DataClassList
{
// DataClass object private_data is like a private member here
};
如果你让private_data
成为DataClassList
的protected
成员而不是private
,让DataClassList
成为DerivedDataClassList
的private base class
成员,那么private_data
就像DerivedDataClassList
的private
成员。
如果你原来的问题没有输入错误,你实际上想要DerivedDataClass对象作为私有成员,那么你可以使用指针。
class DataClassList
{
public:
DataClassList(DataClass * p) : private_data(p) {}
protected:
DataClass * private_data;
};
class DerivedDataClassList : private DataClassList
{
public:
DerivedDataClassList():DataClassList(new DerivedDataClass) { }
// private_data which a pointer to a DerivedDataClass object is like a private member here.
};
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何从另一个文件继承私有成员变量和公共函数
- C++继承更改成员
- 继承和友元函数,从基类访问受保护的成员
- 删除C++继承中虚拟类成员的代码重复
- 成员包含其他继承类的继承类?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- enable_if继承的成员函数的名称查找错误
- 初始化依赖于子类的继承类的常量类成员
- 继承:调用基类的成员和方法
- 类设计:类成员继承自同一基类
- 使用 CRTP 进行选择性静态成员继承
- 具有'using'的模板模板成员继承
- 结构绑定:与公共数据成员(继承的基类)结合
- 为什么C++继承不允许基类的公共成员继承到派生类的私有成员?
- 静态成员继承和保护
- 是否可以检查是否为类定义了成员函数,即使该成员继承自未知基类
- 混合模板/非模板继承分类和成员继承