C++ 如何对用户隐藏私有基类成员和方法
也许我没有把我的问题说清楚,下面的答案并没有回答我的问题。让我把问题说得更具体一些。我的问题是,我有一个基类要发送给客户端,以便客户端可以在其末端开发派生类。如何隐藏私有方法和成员 例如,在下面的代码段中,base.h文件声明了基类,该基类提供了三个私有虚拟方法供客户端在派生类中重写。客户机可以覆盖其中任何一个、任何一个或全部。假设客户机开发了一个名为“派生”的派生类,并将“派生”类创建者传递给我,以便我可以在某处创建派生类,例如Base*p_Base=new-derived()并调用p_Base->Execute()来实际调用虚拟函数DoInitialize()、DoExecute()、DoCleanUp()的客户机实现 顺便说一句:我认为不透明指针不起作用 在Base.h文件中:C++ 如何对用户隐藏私有基类成员和方法,c++,C++,也许我没有把我的问题说清楚,下面的答案并没有回答我的问题。让我把问题说得更具体一些。我的问题是,我有一个基类要发送给客户端,以便客户端可以在其末端开发派生类。如何隐藏私有方法和成员 例如,在下面的代码段中,base.h文件声明了基类,该基类提供了三个私有虚拟方法供客户端在派生类中重写。客户机可以覆盖其中任何一个、任何一个或全部。假设客户机开发了一个名为“派生”的派生类,并将“派生”类创建者传递给我,以便我可以在某处创建派生类,例如Base*p_Base=new-derived()并调用p_Bas
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
保存在您的私人包含中,而不将其分发给库用户
见:
看看这里:
虚拟化呢?如果继承的类不应该提供它们的实现,那就没有意义了。只有@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;
}