1

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

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

由于无法将私有DataClass成员更改为 in DataClassListDerivedDataClass我无法从DerivedDataClassin调用函数DerivedDataClassList

4

3 回答 3

3

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

如果这个类对访问该成员有特殊要求,那么它应该受到保护[然而,这是一个相当愚蠢的概念,因为它根本没有提供任何保护——任何想要进入该领域的人只需要从班级,瞧,他们可以免费访问]。

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

于 2013-01-01T11:28:06.097 回答
2

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

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

template <typename Data>
class DataClassList
{
public:
  /*...*/
private:
  Data private_data;
};

您只需将上面的定义编写一次,但您可以按如下方式创建实例:

DataClassList<DataClass>         standard_list;
DataClassList<DerivedDataClass>  derived_list;

前者是一个包含一个DataClass成员的对象,后者是一个包含一个DerivedDataClass成员(并且没有其他成员)的对象。

于 2013-01-01T11:31:05.733 回答
1

我假设你DataClassprivate_dataDerivedDataClassList. 如果你想使用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作为 of 的protected成员DataClassList而不是 ofprivate并且您将DataClassLista private base classof设为DerivedDataClassList,则private_data其行为类似于 的private成员DerivedDataClassList

如果您的原始问题没有输入错误,并且您实际上希望 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. 
};
于 2013-01-01T11:27:37.913 回答