2013-01-01 73 views
1

我有一个基本数据成员类:我可以继承派生类中的私有成员吗?

class DataClass { 
} 

和子类:

class DerivedDataClass : public 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有我不想重新定义DerivedDataClassDerivedDataClass有其自身的职能一些有用的功能。所以,继承是有道理的。到目前为止,一切都很好。

下一级是问题。 DataClassList具有取决于DataClass函数的有用函数。 DerivedDataClassList将需要从DerivedDataClass以及访问基类所提供的有用函数的数据/运行函数。

如果不能在DataClassList改变私人DataClass成员DerivedDataClass,我不能叫从DerivedDataClass功能DerivedDataClassList

+0

可以这样做吗?没有 – cjds

回答

1

我假设您想要使用DataClass对象private_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作为DataClassList而不是private一个protected成员,你让DataClassListDerivedDataClassList一个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. 
}; 
+0

请参阅我有关“受保护的保护”的回答。 –

+1

@jogojapan看起来我误解了他的问题。假设他错误地输入了他的问题,我更新了答案。 – user93353

3

基本上,你没有。私人意味着私人 - 它只属于那个阶层。正确的方法是有一个存取函数。

如果此类访问该成员有特定的要求,那么它应该受到保护[但是,这是一个相当愚蠢的概念,因为它根本没有提供任何保护 - 任何人只想到达该领域需要从课堂中派生出来,瞧,他们有免费的机会]。

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

+0

结束将对象作为基类的受保护指针。 – Aditya

2

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

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

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

你需要写上面只有一次的定义,但是你可以按照如下创建实例:

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

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

+0

不幸的是,并非DerivedDataClassList中的所有函数在'DataClassList'中都有等价物。这阻止了我模板化DataClassList。但是,我想要考虑一些事情。 – Aditya

+0

在这种情况下,模板专业化可能会有所帮助。但是,如果您可以将成员更改为指针或引用,则其他答案建议的解决方案也可能是可能的。 – jogojapan

+0

我认为指针的想法会起作用。它会需要一个自定义的析构函数来从指针中删除创建的对象吗? – Aditya

相关问题