Κανόνες Συνοψίζοντας πρόσβασης μέλος της κατηγορίας σε C ++

ψήφοι
0

Είμαι προσπαθεί να κατανοήσει πλήρως τους κανόνες πρόσβασης μέλος τάξη ορίζεται σε πολλαπλά σημεία του [class.access] τμήμα του προτύπου C ++. Είναι αρκετά περίπλοκο γι 'αυτό χρειάζονται μια σύντομη αλλά ακριβή και εξαντλητική περίληψη .

Έγραψα αυτό το πρόγραμμα για τον έλεγχο της προσβασιμότητας των προστατευόμενων μελών σε διάφορες καταστάσεις (δεδομένου ότι οι κανόνες για τα προστατευόμενα μέλη είναι το πιο δύσκολο να πάρει):

#include <iostream>

class B {
  protected:
    int i = 1;
    static int const I = 1;
};

class X: public B {
  protected:
    int j = 2;
    static int const J = 2;
  public:
    void f();
    friend void g();
};

class D: public X {
  protected:
    int k = 3;
    static int const K = 3;
};

void X::f() {
  B b;
  X x;
  D d;
  //std::cout << b.i;  // error: 'i' is a protected member of 'B'
  std::cout << b.I;
  std::cout << x.i;
  std::cout << x.I;
  std::cout << x.j;
  std::cout << x.J;
  std::cout << d.i;
  std::cout << d.I;
  std::cout << d.j;
  std::cout << d.J;
  //std::cout << d.k;  // error: 'k' is a protected member of 'D'
  //std::cout << d.K;  // error: 'K' is a protected member of 'D'
}

void g() {
  B b;
  X x;
  D d;
  //std::cout << b.i;  // error: 'i' is a protected member of 'B'
  //std::cout << b.I;  // error: 'I' is a protected member of 'B'
  std::cout << x.i;
  std::cout << x.I;
  std::cout << x.j;
  std::cout << x.J;
  std::cout << d.i;
  std::cout << d.I;
  std::cout << d.j;
  std::cout << d.J;
  //std::cout << d.k;  // error: 'k' is a protected member of 'D'
  //std::cout << d.K;  // error: 'K' is a protected member of 'D'
}

int main() {
  X x;
  x.f();
  g();
  return 0;
}

Ήρθα σε αυτό το συμπέρασμα:

  • δημόσια τα μέλη μιας κατηγορίας είναι προσιτές σε κάθε οντότητες?
  • ιδιωτική μέλη μιας κατηγορίας είναι προσβάσιμες μόνο στα μέλη και τους φίλους αυτής της κατηγορίας?
  • προστατεύονται τα μέλη μιας κατηγορίας είναι προσβάσιμες μόνο στα μέλη και τους φίλους της κατηγορίας αυτής, τα μέλη και τους φίλους του παραγόμενες κλάσεις της κατηγορίας αυτής, αν τα προστατευόμενα μέλη που κληρονόμησε από τις παραγόμενες κλάσεις ή βάσης τάξεις των παραγόμενες κλάσεις, καθώς και στα μέλη των κατηγοριών βάσης της κατηγορίας αυτής, αν τα προστατευόμενα μέλη είναι στατική .

Είναι η περίληψη μου ακριβείς και πλήρεις;

Δημοσιεύθηκε 14/02/2020 στις 00:02
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Εάν η ερώτησή σας βασίζεται στην πρόσβαση, αυτοί είναι οι κανόνες μέσα σε C ++. Θα κάνω μια βασική περίληψη παρακάτω, αλλά για την εξαντλητική εξηγήσεις παρακαλώ πηγαίνετε εδώ . Αυτό θα υπεισέλθω σε περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί το καθένα.

  • δημόσια - λειτουργίες και οι μεταβλητές είναι σε θέση να έχουν πρόσβαση στην ίδια κατηγορία, που προέρχεται τάξη και εκτός τάξης

  • προστατεύονται - λειτουργίες και οι μεταβλητές είναι σε θέση να έχουν πρόσβαση στην ίδια κατηγορία, και τα παράγωγα της κατηγορίας

  • ιδιωτική - λειτουργίες και οι μεταβλητές είναι σε θέση να έχει πρόσβαση στην ίδια κατηγορία.

Όταν πρόκειται για την κληρονομιά έχετε πολλούς τύπους, καθώς και:

  • δημόσια - δημόσιων και προστατευόμενων μελών κληρονομούνται με τις αντίστοιχες τύπου πρόσβασή τους
  • προστατεύονται - Τα δημόσια μέλη κληρονομούνται ως προστατευόμενες και των προστατευόμενων μελών θα κρατήσει το είδος της πρόσβασης τους.
  • ιδιωτικού - δημόσιου και ιδιωτικού μέλη θα κληρονομήσει

Σημείωση : παραγόμενες κλάσεις κληρονομεί όλες τις μεθόδους της κλάσης βάσης με την ακόλουθη εξαίρεση.

  • Κατασκευαστές, καταστροφείς και κατασκευαστές αντίγραφο της βασικής κλάσης

  • Υπερφορτωμένο φορείς της κατηγορίας βάσης.

  • Οι λειτουργίες φίλος της βασικής κλάσης.

Τώρα, όπως και για το φίλο προσδιοριστή, αυτό είναι από την αναφορά CPP εδώ Εδώ θα έχετε παραδείγματα και λεπτομερείς εξηγήσεις για το πώς να το χρησιμοποιήσετε.

Θα βρείτε επίσης παραδείγματα για πολλές πληροφορίες εκεί, όταν πρόκειται για την πρότυπη βιβλιοθήκη, και θα είστε σε θέση να δούμε τι έρχεται με το πρότυπο στο μέλλον και ποια χαρακτηριστικά υποστηρίζει compiler σας.

Απαντήθηκε 14/02/2020 στις 05:22
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more