在派生类中强制使用受保护的构造函数

时间:2015-10-22 11:46:40

标签: c++ inheritance

是否有任何机制允许在派生类中强制执行受保护的构造函数?

简单示例:

template<typename T>
class Factory;

class Base {
  template<typename T>
  friend class Factory;
protected:
  Base();
};


class Child : public Base {
public:
  Child(); // this should lead to a compile time error
};

<template T>
class Factory {
Base* GetNew()
{
  BOOST_STATIC_ASSERT(boost::is_base_of<Base, T>::value);

  Base* b = new T();
  b->doStuff();

  return b;
 }
};

所以我希望Child类只能由工厂创建,并强制从Base派生的所有子类都有一个受保护的构造函数。

2 个答案:

答案 0 :(得分:4)

不,没有办法强制执行此操作。通常,基类在限制子类的方式上非常有限。 Base不是,也不应该试图负责监管每个可能写一个恰好继承自Base的类的人。

答案 1 :(得分:4)

简短回答,没有那种。

protected是最不实用的访问说明符,因为任何派生类都可以自由地使名称(包括构造函数的名称)公开。

可以做的是使用构造函数中的访问键来确保只有工厂创建类。

struct factory;

// create_key's constructor is private, but the factory is a friend.
class create_key
{
  create_key() {};
  friend factory;
};

struct only_from_factory
{
  // base constructor demands a key is sent. Only a factory may create a key.
  only_from_factory(const create_key&) {};
};