C++ 对客户端隐藏私有类成员和方法

C++ 对客户端隐藏私有类成员和方法,c++,private,C++,Private,让我把问题说得更具体一些。我的问题是,我有一个基类要发送给客户端,以便客户端可以在其末端开发派生类。如何隐藏私有方法和成员 例如,在下面的代码段中,base.h文件声明了基类,该基类提供了三个私有虚拟方法供客户端在派生类中重写。客户机可以覆盖其中任何一个、任何一个或全部。假设客户机开发了一个名为“派生”的派生类,并将“派生”类创建者传递给我,以便我可以在某处创建派生类,例如Base*p_Base=new-derived()并调用p_Base->Execute()来实际调用虚拟函数DoInitia

让我把问题说得更具体一些。我的问题是,我有一个基类要发送给客户端,以便客户端可以在其末端开发派生类。如何隐藏私有方法和成员

例如,在下面的代码段中,base.h文件声明了基类,该基类提供了三个私有虚拟方法供客户端在派生类中重写。客户机可以覆盖其中任何一个、任何一个或全部。假设客户机开发了一个名为“派生”的派生类,并将“派生”类创建者传递给我,以便我可以在某处创建派生类,例如Base*p_Base=new-derived()并调用p_Base->Execute()来实际调用虚拟函数DoInitialize()、DoExecute()、DoCleanUp()的客户机实现

顺便说一句:我认为不透明指针不起作用

在Base.h文件中:

  class Base {
        public:
              Base(); 
             ~Base();
        void Execute(); 
    
        private:
        // virtual functions to be overridden by derived classes.
        virtual void DoInitialize() {}
        virtual void DoExecute() {}
        virtual void DoCleanUp() {}
    
        private: 
        // private members and functions that are intended to hide from clients
        std::vector<float> data_; 
        ....
}
在客户端

class Derived : public Base {
     public:
         Derived();
         ~Derived();

     private:
         // overide base class methods 
         void DoInitialize() {}
         void DoExecute() {}
         void DoCleanUp() {}
}
在我最后的某个地方:

void main() {
     Base* p = DerivedCreater(); // creater a Derived class, assumes DerivedCreater() has passed in by clients. 
     p->Execute(); // I want to call the client implementation of DoInitialize(), DoExecute(), and DoCleanUp()
}

您应该有一个接口类。它没有数据成员,只有纯虚拟函数。客户机可以使用接口类作为基础编写任何类,并实现虚拟函数。他们必须构造对象并向您传递接口指针。然后您可以调用这些虚拟函数,而不知道它们是如何实现的

如果希望客户机对象为您携带指针,请将该部分作为接口函数(get、set)的一部分,不要将其作为数据成员添加到接口类中


请参见此处的示例界面:

我认为PIMPL是最好的选择。我没有重新发布链接,因为它是关于同一主题的另一个问题中的第一个链接。不透明的
m_impl
指向实现的指针,其中
m_impl
知道
Base
,并调用其虚拟函数。我必须重新发布我的问题,因为我之前帖子中的答案完全混乱。通常这意味着这两个问题中的一个将作为另一个问题的副本关闭。您可能对此感兴趣:@Ted Lynmo,更广泛的范围是我们将在引擎盖下为DoExecute()提供数据输入,用户将实现DoExecute(),无论他们想处理数据什么。DoInitialize()和DoCleanUp()实际上是在Base::Execute()之外执行的,但这里我只想简单地回答一个问题,这似乎与OP想要的相反。pimpl看起来更像OP所需要的。pimpl用于隔离具体的类实现,以便其他代码不受隐藏的impl结构或类中的更改的影响。这里,3个虚拟函数是接口。是的,它们是隐藏数据的接口-使用pimpl的原因可能是你想像你说的那样隔离它,但也可能是因为你想对最终用户隐藏所有的实现细节,这是我个人认为OP想要的。然而,我认为它将如何使用它还不清楚,因为它在示例代码中没有访问任何基类成员函数的权限。@Khouri Giordano,谢谢你的回答。这似乎是我在寻找的,但我不确定我是否完全明白你的意思。您介意根据问题中的示例代码编写一个简单的示例代码吗?我非常感谢。@Charlie如果你创建了一个可以作为纯接口的东西,那么就不会有隐藏的
std::vector data在基类中。
void main() {
     Base* p = DerivedCreater(); // creater a Derived class, assumes DerivedCreater() has passed in by clients. 
     p->Execute(); // I want to call the client implementation of DoInitialize(), DoExecute(), and DoCleanUp()
}