C++ 中的向上转型、向下转型和隐藏方法

Upcast, downcasting, and hiding methods in C++

我正在编写一个需要创建复杂对象 (D) 的 C++ 库,但是 return 向我的库的用户提供了一个指向简化对象 (B) 的指针(隐藏了许多方法复杂对象)。我决定通过 return 指向简化基础 class (B) 的指针来实现这一点,并将我所有的复杂功能添加到派生的 class (D),如下所示:

class B {
  virtual void simple() = 0;
}

class D : public B {
  void simple() { cout << "visible simple stuff" ; }
  void complex() { cout << "invisible complex stuff" ; }
}

我在内部创建了我的对象 D,但我 return 一个向上转换指针如下:

D Derived;
B *Bptr = &Derived;
return Bptr;
  1. 这是对用户隐藏功能,同时使所有附加功能在库中可见的正确方法吗?

  2. 隐藏 class D 的 .h 文件是否是防止我的库用户访问 D 方法的唯一方法? (向下转换回 D class)我会将库作为开源发布,因此库的用户可以访问 D class 定义。

关于问题 #1:是的,如果您提供工厂方法以及 'simple' 接口:

class B {
public:
    static B * create();
    virtual void simple() = 0;
};

在B的实现文件(cpp)中:

B *B::create()
{
    return new D(); //or whatever 'hidden' implementation 
}

关于您的 #2:隐藏功能首先意味着简化,旨在帮助图书馆用户,而不是惩罚性约束。所以,完全隐藏 D class,让(好的)用户满意。