C++ 如何对用户隐藏私有基类成员和方法

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

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

例如,在下面的代码段中,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()
}

方法是使用一个指向实现的不透明指针

class BaseImpl;

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

private:
// virtual functions to be overridden by derived classes.
virtual void Initialize() {}

private: 

// private members and functions that are not intended to override by derived classes
void Configure() { m_impl->Configure(); }
BaseImpl* m_impl;
}
然后,在
BaseImpl
中,保留一个指向
Base
的指针,并根据需要调用虚拟函数。您将
BaseImpl.h
保存在您的私人包含中,而不将其分发给库用户

见:

看看这里:私下<代码>代码>虚拟<代码>函数在C++中完全工作,就像你已经在例子中所做的那样。我不确定我是否理解问题所在here@Human-编译器,我认为他不仅要隐藏实现细节,还要隐藏抽象的细节;函数名、变量名和函数取的值等等on@d4rk4ng31那么为什么要将这些
虚拟化呢?如果继承的类不应该提供它们的实现,那就没有意义了。只有@Human编译器正确理解我的问题。也许我没有把问题说清楚。我要问的是,我有一个基类要发送给客户机,以便客户机可以在其端开发派生类。但是,我不想公开私有成员和方法。我该怎么做呢?我会让它
std::unique\u ptr m\u impl-但是是的,这似乎是一个可行的方法。
class BaseImpl;

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

private:
// virtual functions to be overridden by derived classes.
virtual void Initialize() {}

private: 

// private members and functions that are not intended to override by derived classes
void Configure() { m_impl->Configure(); }
BaseImpl* m_impl;
}