2015-06-10 15 views
5

W języku C++, jeśli mam abstrakcyjną klasę podstawową, czy można uniemożliwić tworzenie klas pochodnych instancjom klas innym niż przyjaciele, o których wie klasa podstawowa?W języku C++, czy mogę zapobiec tworzeniu klasy wynikowej przez klasy inne niż znajomi?

+0

Jeśli to C# Proponuję oznaczając go jako wewnętrzne tak, że tylko „przyjaciel” Klasy byłoby znać baza. Zapobiegłoby to dziedziczeniu poza strefą przyjaciela. Jeśli jednak chcesz wykroczyć poza to, ale tylko skonstruować ze strefy przyjaciela, jest to znacznie bardziej złożony problem. –

Odpowiedz

7

Możesz zdefiniować konstruktory jako prywatne, tak jak każdą inną funkcję. Na przykład:

class foo 
{ 

friend foo *FooConstructor(void); 

public: 
    void Method(); 
    void Method2(); 

private: 
    foo(); 
    foo(const &foo); 
}; 

foo *FooConstructor(void) 
{ 
    return new foo(); 
} 

Zapobiega to foo tworzone w jakikolwiek sposób zaoszczędzić z funkcją FooContructor.

2

Istnieją dwa sposoby można mieć bazę klasy wewnętrzny

Pierwszym jest, aby konstruktorzy prywatny, tak:

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 

Drugim sposobem jest zadeklarować klasy base w anonimowej przestrzeni nazw:

namespace { 
    struct Base{}; 
} 

struct Sub : Base {}; 

teraz wszystkie zajęcia w tej samej jednostce translacji mogą korzystać Base, b Inne klasy nie wiedzą, że istnieje.

ten sposób jest często mniej pożądane, zajęcia od pochodzące mogą tylko być stosowany jako niepełnych typów (przekazany)

Powiązane problemy