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?
5
A
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
- 1. Jak zasubskrybować inne zdarzenia klasy w języku C#?
- 2. Czy mogę podać sensowną nazwę klasy anonimowej w języku C#?
- 3. W języku Java, czy można wywołać konstruktor nadklasy klasy macierzystej przez konstruktor klasy potomnej klasy nadrzędnej?
- 4. jak zapobiec dziedziczeniu klasy "a" przez inną klasę?
- 5. Jak zapobiec tworzeniu przez sfinksa hiperłącza?
- 6. Tworzenie klasy Pythona w języku C#
- 7. Dziedziczenie z klasy szablonu w języku C++
- 8. Jak utworzyć inne klasy z klasy singleton?
- 9. Wywoływanie System.Delegate obiekt klasy w języku C#
- 10. Używanie klasy VB6 w języku C#
- 11. Czy mogą istnieć samodzielne funkcje w języku C# bez klasy?
- 12. Czy można zapobiec powstawaniu "anonimowo" klasy w stylu RAII?
- 13. Domyślnie Dostępność klasy w języku C#
- 14. C#: utwórz akcję "zrób to sam" przy tworzeniu klasy
- 15. Czy w języku C# występuje odpowiednik zagnieżdżonej klasy statycznej Java?
- 16. Czy można utworzyć obiekt bez klasy w języku C#?
- 17. Czy klasy abstrakcyjne mają implementację w języku C#?
- 18. C# zapobiec ukrywaniu metody klasy bazowej przez nowy modyfikator w klasie pochodnej
- 19. Dzielenie liczby przez instancje mojej klasy w języku Python
- 20. Jak zapobiec kpiny z klasy super przez jmockit?
- 21. Czy mogę dołączyć kod do klasy PHP?
- 22. Jak mogę sprawdzić w języku C#, czy właściwość klasy jest używana w rozwiązaniu Visual Studio?
- 23. Konwersja System.Data.Entity.DynamicProxies do (nie proxy) klasy w języku C#
- 24. Jak wyświetlić VTABLE klasy C++ przez GCC?
- 25. Klasy C++ jako zmienne instancji klasy Objective-C
- 26. Zwracanie klasy C++ do Javy przez JNI
- 27. Uzyskaj nazwę klasy jako ciąg znaków w języku C#
- 28. Python - czy mogę programowo dekorować metody klasy z instancji klasy?
- 29. Problemy z nadpisaniami funkcji częściowej klasy w języku C++
- 30. Java Singleton - zapobiec wielokrotnemu tworzeniu poprzez odbicie
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. –