C++ 我可以在派生类中对私有成员进行子类化吗?

C++ 我可以在派生类中对私有成员进行子类化吗?,c++,inheritance,C++,Inheritance,我有一个基本数据成员类: class DataClass { } 和一个子类: class DerivedDataClass : public DataClass { } 我使用DataClass作为类DataClassList的私有成员 class DataClassList { public: // some useful functions here private: DataClass private_data; } 我想将DataClassList子类化,

我有一个基本数据成员类:

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++中以某种形式完成?< /P> 编辑: 添加更多关于我正在尝试做的事情的注释:

DataClass
有一些我不想在
DerivedDataClass
中重新定义的有用函数,
DerivedDataClass
有自己的函数。因此,继承是有意义的。到目前为止一切都很好

下一个层面是问题
DataClassList
具有依赖于
DataClass
函数的有用函数<除了基类提供的有用函数外,code>DerivedDataClassList还需要从
DerivedDataClass
访问数据/运行函数


无法将
DataClassList
中的私有
DataClass
成员更改为
DerivedDataClass
,我无法从
DerivedDataClassList
中的
deriveddataclassclass
调用函数,我假设您想在
DerivedDataClassList
中使用
DataClass
对象
private\u 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\u数据
设置为
DataClassList
受保护的
成员,而不是
private
,并且将
DataClassList
设置为
DerivedDataClassList
私有基类
,然后,
private\u 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. 
};

我假设您想在
DerivedDataClassList
中使用
DataClass
对象
private\u数据
。 如果要使用
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\u数据
设置为
DataClassList
受保护的
成员,而不是
private
,并且将
DataClassList
设置为
DerivedDataClassList
私有基类
,然后,
private\u 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. 
};

基本上,你没有。Private意味着Private——它只属于那个类。正确的方法是使用访问器函数

如果这个类需要访问该成员,那么它应该受到保护[然而,这是一个相当愚蠢的概念,因为它根本不提供保护-任何想要访问该字段的人只需要从该类派生,瞧,他们可以自由访问]


感谢jogojapan指出我错过了一点。使用模板的答案是一种解决方案。另一种方法是在基类中使用指针,然后让访问器函数将
private_数据设置为提供的类成员。哪一个“正确”取决于你想做什么。例如,如果它是某种元素的列表(例如图形对象(窗口、菜单等)或游戏对象),并且您实际上希望它们是一个列表[或几个类似的列表],那么使用指针是正确的解决方案。如果您有几种不同类型的对象,而这些对象从未以通用方式使用过,那么template类可能是正确的选择

基本上,你没有。Private意味着Private——它只属于那个类。正确的方法是使用访问器函数

如果这个类需要访问该成员,那么它应该受到保护[然而,这是一个相当愚蠢的概念,因为它根本不提供保护-任何想要访问该字段的人只需要从该类派生,瞧,他们可以自由访问]


感谢jogojapan指出我错过了一点。使用模板的答案是一种解决方案。另一种方法是在基类中使用指针,然后让访问器函数将
private_数据设置为提供的类成员。哪一个“正确”取决于你想做什么。例如,如果它是某种元素的列表(例如图形对象(窗口、菜单等)或游戏对象),并且您实际上希望它们是一个列表[或几个类似的列表],那么使用指针是正确的解决方案。如果您有几种不同类型的对象,而这些对象从未以通用方式使用过,那么template类可能是正确的选择

一旦您为此使用继承,您将从基类中获得
private_data
成员,作为派生类的成员,尽管是不可访问的成员。无法更改派生类中基类成员的数据类型

我相信在您的情况下使用类模板会更好:

template <typename Data>
class DataClassList
{
public:
  /*...*/
private:
  Data private_data;
};
模板
类数据类列表
{
公众:
/*...*/
私人:
数据私有化;
};
您只需编写上述定义一次,但可以按如下方式创建实例:

DataClassList<DataClass>         standard_list;
DataClassList<DerivedDataClass>  derived_list;
DataClassList标准列表;
DataClassList派生的\u列表;
前者是包含
DataClass
成员的对象,后者是包含
DerivedD的对象