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;
这是对用户隐藏功能,同时使所有附加功能在库中可见的正确方法吗?
隐藏 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,让(好的)用户满意。
我正在编写一个需要创建复杂对象 (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;
这是对用户隐藏功能,同时使所有附加功能在库中可见的正确方法吗?
隐藏 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,让(好的)用户满意。