2015-10-22 7 views
6

派生クラスで保護されたコンストラクタを実行するメカニズムはありますか?クラスを生成する際に保護されたコンストラクタを適用する

簡単な例:

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; 
} 
}; 

だから私は、子供のクラスは、工場でのみ作成可能と基地から派生するすべての子クラスは、保護されたコンストラクタを持っていることを強制します。

答えて

4

いいえ、これを強制する方法はありません。一般的に、基本クラスはサブクラスを制約する方法が非常に限られています。 Baseは、Baseから継承されたクラスを書く可能性のあるすべての人を警察する責任はありません。

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&) {}; 
}; 
+0

ありがとう、この非常に良いアイデア。私は実際にはすでに同様のことについて実際に考えていました。私もあなたの答えを受け入れたいと思いますが、残念ながら私は1つしか受け入れることができません。 – Chris

+1

これは問題ありません。私は栄光のためにこれをしません。 (a)それは私に警告を覚えさせ、(b)私はC++が素晴らしい言語だと思ってしまい、それがうまく使用されているのが好きだからです。 –

関連する問題