Non sono sicuro se questo è quello che stai cercando o se questo vi aiuterà nel vostro caso. Mostrerò comunque un comportamento polimorfico.
Protetta di costruzione astratta Classe
class BaseProtected {
// ----- Member Variable Section -----
public:
// There Shouldn't Be Public Variables In A Base Class Unless
// That Is The Behavior You Are Looking For - Keep In Mind
// Every Inherited Class & Outside Class Can Change Them.
protected:
// Member Variables Here To Be Shared With Each Derived Class
private:
// Member Variables Here To Be Used By Base Class Only
// ----- Member Function Section -----
public:
virtual ~BaseProtected(); // Virtual Destructor
void somefunc() const; // Common Function Between All Derived Class
virtual void allDerivedMustImplement() const; = 0 // Purely Virtual
protected:
// Default Constructor - Can Not Declare An Instance Of Base Class
BaseProtected(); // Abstract Class
// Protected Functions Shared Between Classes
// Protected Functions That Are Purely Virtual If Needed
private:
// Private Functions Used By Base Class Only
}; // BaseProtected
classe derivata con l'ereditarietà Possibile
class DerivedWithPossibleInheritance : public BaseProtected {
// ----- Member Variable Section -----
public:
// Public Member If Giving Free Access
protected:
// Protected Members If Being Inherited From
private:
// Private Members Unique To This Derived Class
// ----- Member Function Section -----
public:
DerivedWithPossibleInheritance(); // Default Constructor
virtual ~DerivedWithPossibleInheritance(); // Virtual Destructor
void uniqueFunctionForThisClass() const;
void allDerivedMustImplement() const override;
private:
// Private Functions Unique To This Class
}; // DerivedWithPossibleInheritance
classe derivata che non può essere ereditata da
class DerivedClassCanNotBeInheritedFrom sealed : public BaseProtected {
// ----- Member Variable Section -----
public:
// Public Members Variables
protected:
// Should Not Have Member Variables Here For This Class Can Not Be Inherited from
private:
// Private Members Variables
// ----- Member Function Section ------
public:
DerivedClassCanNotBeInheritedFrom(); // Default Constructor
virtual ~DerivedClassCanNotBeInheritedFrom(); // Default Virtual Destructor
void anotherUniqueFunctionForThisClass() const;
void allDerivedMustImplement() const override;
protected:
// There Should Not Be Any Functions Here This Can Not Be Inherited From
private:
// Private Member Functions Here
}; // DerivedClassCanNotBeInheritedFrom
Quello che ho dimostrato qui è la chiave parola sigillata quando si lavora con l'ereditarietà e il polimorfismo. Se non si desidera che la classe venga derivata, utilizzare la parola chiave sealed.
Come per dichiarare qualsiasi classe base, una classe autonoma o una classe singleton che ha un Costruttore privato è necessario l'uso della parola chiave friend. Ci sono molti tipi di implementazioni da coinvolgere qui per mostrarle, ma il concetto di impedire che una classe venga ereditata è lo stesso. Personalmente non ho usato la parola chiave final, ma ho usato la parola chiave sealed e funziona molto bene.
Non ho usato l'ereditarietà di classi diverse da quelle pubbliche: Quindi rispondere alle tue domande in termini di eredità privata o protetta non è qualcosa con cui sono veramente familiare. Ma forse l'uso della parola chiave sigillata potrebbe aiutarti.
fonte
2015-05-05 02:43:31
protetta di default (altri) costruttori. –
@ DieterLücking O distruttori, ma potrebbe risultare più difficile. –
@ DieterLücking anche se rendo protetto il ctor in 'Base', la riga' class PublicDerived: public Base {}; 'compila ancora, poiché le classi derivate" sanno "come costruire la base. Di fatto, l'intero programma viene compilato. E anche il problematico 'Base * pBase = new PrivateDerived;' sarà ancora ok. – vsoftco