Dal punto di vista linguistico, che non è più di una violazione di incapsulamento che creare un metodo delegato nell'oggetto derivato:
class Y : public X
{
public:
void protectedFunction() {
X::protectedFunction();
}
};
Una volta che un metodo è protetto, esso viene offerto alle classi Derivazione a che fare con ciò che desiderano. L'intenzione per la dichiarazione using
non modificava l'accesso ai metodi ereditati, ma evitava i problemi con il metodo hiding (in cui un metodo pubblico in X
sarebbe nascosto nel tipo Y
se è definito un sovraccarico diverso).
Ora, è un fatto che, a causa delle regole del linguaggio, può essere utilizzato per modificare il livello di accesso per i metodi "usati" come nell'esempio, ma in realtà non apre alcun buco nel sistema. Alla fine, le classi derivate non possono fare nulla di più di quello che potevano fare prima.
Se la domanda reale è se il particolare utilizzo è una violazione dell'incapsulamento dal punto di vista del design (dove il design qui è design di applicazioni, non design di linguaggio), allora molto probabilmente sì. Nello stesso modo in cui rendono pubblici i dati o i metodi interni. Se è stato progettato per essere protetti dal progettista iniziale di X
, allora è probabile che Y
implementazioni non voleva che fosse pubblico ... (o offrendo un metodo di delega per lo stesso scopo)
fonte
2010-01-19 17:10:04
chiarire - lo scopo della mia domanda non era di parlare di modi bruti o ingannevoli per rompere l'incapsulamento. volevo solo discutere le decisioni di progettazione o alcune altre caratteristiche di C++ che potrebbero aver portato a questa funzione. È solo un effetto collaterale della soluzione al problema di nascondere la funzione o è una funzionalità indipendente introdotta in C++ per qualche motivo specifico –
Penso che la ragione per cui le persone elencano tutti questi modi per interrompere l'incapsulamento non è documentare come fallo, ma per spiegare che devi scegliere di interrompere l'incapsulamento. Quando si verifica un errore perché si è tentato di accedere a un metodo oa un membro privato, ciò potrebbe servire come un delicato promemoria e, se si onorano i desideri del progettista, è necessario progettare una soluzione cooperativa. È sempre scontato che l'incapsulamento possa essere forzatamente rotto. L'incapsulamento "protetto" non può essere spezzato senza la forza, il che non credo sia un fallimento in una parte della lingua. –