C++隐藏继承的类

C++ hiding inherited class?

本文关键字:继承 隐藏 C++      更新时间:2023-10-16

我试图从链接它的可执行文件中隐藏我编写的库的主类标头中包含的第三方文件。我的意思是:

我写了一个定义类a的库。类a继承自类B(在第三方库中定义)。示例:

// In A.h
#include “B.h”
class A : public B
{
    A* something(A* val);
}
// In A.cpp
A* A::something(A*val)
{
    // Do something
    return val;
}

类B的头文件对环境进行了一些更改,这些更改非常适合我的库,但对链接我的库的任何可执行文件都是有害的。有人向我指出不透明指针是一个潜在的解决方案,尽管我不知道如何使用它们来隐藏"B"。

有人知道隐藏B.h的方法吗?对于解决方案,C++11是可以的,但链接到其他依赖项(如boost)不是一种选择。

在C++世界中隐藏"实现"的一种常见方法是使用Pimpl/Handle-body/bridge习语。

不要将类A公开给API的用户,而是使用一个只公开您想要的句柄类:

在A.h 中

class AImpl;  // forward declaration
class A {
private:
  AImpl* impl;
public:
  foo();
  bar();
}

然后在另一个文件中进行实际实现:

AImpl.h

#include <B.h>
class AImpl: public B {
private:
public:
  foo();
  bar();
  somethingThatYouDontWantToExpose();
}

使用不透明指针的方法是向前声明需要使用的类,这样就不需要include它们的定义。由于您不包括B.h,所以库的客户端不会被它们的定义所污染。

// In A.h
class B;
class A
{
private:
    B* opaque;
};