私人继承或遏制

时间:2012-11-19 21:42:52

标签: c++ inheritance containment

我有一个带有几个公共方法的基类,并且想要派生一个只继承某些函数的子类,所以我使用私有继承派生了子类。另外,我发现了几次(包括C ++ primer plus),私有继承几乎就像包含一样。现在我有一个问题,我想使用Base中定义的函数在派生类中可用。

除了基类所需的私有成员之外,派生类没有任何私有成员。我不确定如何为代码中显示的派生类定义公共方法“func”。

class Base
{
private:
    double *p;
public:
    Base(int m, int n);
    void fun(const Base & obj1, const Base & obj2)
};

class Derived : private Base
{
public:
    Derived(int n) : Base(1,n) {}
    void fun(const Derived & obj1,const Base & obj2)
    {
    /* The function fun in derived class works almost exactly 
       like fun in Base class but I don't know how to call 
       Base.Fun(...). Also all the data needed to perform 
       operations in this function is a part of the private 
       member of the base class which the Derived member can't 
       access.
    */
    }
}

如果我要使用遏制,我可以如下定义:

class Derived
{
private:
    Base P;
public:
    void fun(const Derived & obj1,const Base & obj2)
    {
        Base :: P.func(obj1.P,obj2);
    }
 };

这让我想知道遏制在这里是否比私有继承更合适。另一方面,我不确定其中任何一个实现是否正确。所以我正在寻找可行的方法。

请注意,我没有在上面的代码中显示复制构造函数,赋值和运算符以及其他一些方法,但我知道它们的要求。这些代码只是为了显示私有继承和包含的基本目的。

1 个答案:

答案 0 :(得分:1)

如果Derived的有趣方法只能通过直接访问Base的私有成员来实现,那么继承或包含都不允许Derived访问这些方法。使用继承,成员可能需要受到保护(或公共),或者需要添加受保护(或公共)的getter / setter方法。使用组合将需要使用公共getter / setter方法来避免公开这些数据成员。

在Derived this的有趣方法中:

Base::fun(obj1, obj2) 

将调用类Base的有趣方法。