Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 私有继承或控制_C++_Inheritance_Containment - Fatal编程技术网

C++ 私有继承或控制

C++ 私有继承或控制,c++,inheritance,containment,C++,Inheritance,Containment,我有一个具有多个公共方法的基类,并且希望派生一个只继承某些函数的子类,因此我使用私有继承派生了子类。另外,我也遇到过几次(包括C++ + Plus),私有继承几乎完全像包容。现在我有一个问题,我想使用一个在Base中定义的函数来在派生类中可用 除了基类所需的成员外,派生类没有任何私有成员。我不确定如何为派生类定义公共方法“func”,如代码所示 class Base { private: double *p; public: Base(int m, int n); voi

我有一个具有多个公共方法的基类,并且希望派生一个只继承某些函数的子类,因此我使用私有继承派生了子类。另外,我也遇到过几次(包括C++ + 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);
    }
 };
这让我想知道,在这里包容是否比私有继承更合适。另一方面,我不确定这两种实现是否正确。因此,我正在寻找可能的方法来做到这一点


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

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

在这个有趣的方法中:

Base::fun(obj1, obj2) 

将调用基类的有趣方法。

Josh,这些方法不需要直接访问基类的私有成员。我尽量避免使用getter和setter,因为每次都需要复制。你能告诉我为什么我显示的包含代码段不能工作吗?派生的fun方法中的调用需要是
P.Base::fun(obj1.P,obj2)以正确编译。顺便说一句,在您的注释中,您“在该函数中执行操作所需的所有数据都是派生成员无法访问的基类私有成员的一部分。”这就是我关于直接访问基类的主要成员的陈述的来源。的可能重复