在c++中,可以防止派生类被友类以外的类实例化吗?
In C++, can I prevent derived class being instantiated by classes other than friends
在c++中,如果我有一个抽象基类,是否有可能防止它的派生类被基类知道的友类以外的类实例化?
您可以将构造函数定义为私有的,就像任何其他函数一样。例如:
class foo
{
friend foo *FooConstructor(void);
public:
void Method();
void Method2();
private:
foo();
foo(const &foo);
};
foo *FooConstructor(void)
{
return new foo();
}
这可以防止以任何方式创建foo
,保存FooContructor
函数
有两种方法可以在内部使用基类
struct Sub1;
struct Sub2;
struct Base
{
virtual ~Base() = default;
private:
Base() = default;
Base(const Base&) = default;
friend struct Sub1;
friend struct Sub2;
};
struct Sub1 : protected Base {}; // ok, its a friend
struct Sub2 : protected Base {}; // ok, its a friend
struct Sub3 : protected Base {}; // compiler error
第二种方法是在匿名命名空间中声明基类:
namespace {
struct Base{};
}
struct Sub : Base {};
现在,同一翻译单元中的所有类都可以使用Base
,但是其他类不知道它的存在。
这种方式通常不太理想,因为派生类只能用作不完整类型(转发)
相关文章:
- 从模板基类派生是否在派生类声明的点实例化模板
- 派生模板类对象的实例化
- 为什么不能在实例化对基类的引用的同时实例化指向派生类的指针?
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 为什么C++可以使用派生结构来实例化其父模板结构,而父模板可以调用子结构的函数?
- 如何在不实例化派生类的情况下管理一组派生类枚举
- C++ 实例化派生类的语法异常
- 是否可以在不实例化派生类的情况下调用该类的虚拟函数
- Cython C 类继承无法实例化派生类
- 我做了什么?需要在模板化类的方法中实例化派生类
- C++ - 实例化派生类并使用基类的构造函数
- 如何通过映射实例化派生类中的对象
- 只实例化派生类一次错误的 OOP
- 实例化派生自接口的类,该接口位于派生自接口的另一个类中...只需阅读即可找出答案
- 实例化派生类对象,该对象的基类ctor是私有的
- 抽象类的Std::shared_ptr来实例化派生类
- 在c++中实例化派生类型
- 强制实例化派生类型而不是基类型
- 如何实例化派生类而不必重写代码
- C++-根据上下文实例化派生类