C ++中的向上转换,向下转换和隐藏方法

时间:2017-12-27 13:09:19

标签: c++ pure-virtual downcast upcasting

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

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

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

在内部我创建了我的对象D,但是我返回一个向上指针,如下所示:

D Derived;
B *Bptr = &Derived;
return Bptr;
  1. 这是否是隐藏用户功能的正确方法,同时在库中显示所有其他功能?

  2. 隐藏D类的.h文件是阻止我的图书馆用户访问D方法的唯一方法吗? (向下转回D类)我将以开源方式发布库,因此库的用户可以访问D类定义。

1 个答案:

答案 0 :(得分:0)

关于问题#1 :是的,如果您提供工厂方法以及简单的&#39;接口:

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

在B&#39的实施文件中(cpp):

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

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