繁体   English   中英

我可以将私有成员细分为派生类吗?

[英]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访问数据/运行功能。

无法将DataClass中的私有DataClass成员DataClassListDerivedDataClass ,我无法从DerivedDataClass中的DerivedDataClassList调用函数。

基本上,您不需要。 私有表示私有-它仅属于该类。 正确的方法是具有访问器功能。

如果对此类访问该成员有特殊要求,则应对其进行保护[但是,这是一个非常愚蠢的概念,因为它根本没有提供保护-任何想要进入该领域的人都只需从上课,瞧,他们可以免费使用]。

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

一旦为此使用继承,就可以从基类中获得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作为protected的成员DataClassList而不是private和你做DataClassList一个private base classDerivedDataClassList ,然后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. 
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM