2010-12-24 20 views
10

De qué manera debería tener acceso a este método padres y variables de los padres?C++: el acceso a los métodos de padres y variables

class Base 
{ 
public: 
    std::string mWords; 
    Base() { mWords = "blahblahblah" } 
}; 

class Foundation 
{ 
public: 
    Write(std::string text) 
    { 
     std::cout << text; 
    } 
}; 

class Child : public Base, public Foundation 
{ 
    DoSomething() 
    { 
     this->Write(this->mWords); 
     // or 
     Foundation::Write(Base::mWords); 
    } 
}; 

Gracias.

Editar: ¿Y qué pasa si hay ambigüedad?

Respuesta

10

Los dos sintaxis que utiliza en su código (this->... y calificados nombres) sólo son necesarios especialmente cuando hay ambigüedad o algún otro problema de búsqueda de nombre, como el nombre del escondite, la clase base de la plantilla, etc.

Cuando no hay ambigüedad u otros problemas, no necesita ninguna de estas sintaxis. Todo lo que necesita es un nombre simple sin calificar, como Write en su ejemplo. Solo Write, no this->Write y no Foundation::Write. Lo mismo se aplica al mWords.

I.e. en su ejemplo específico, un simple Write(mWords) funcionará perfectamente.


Para ilustrar lo anterior, si su método DoSomething tenía mWords parámetro, como en

DoSomething(int mWords) { 
    ... 

miembro de la clase entonces este parámetro local mWords ocultaría heredada mWords y que tendría que utilizar

DoSomething(int mWords) { 
    Write(this->mWords); 
} 

o

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

para expresar su intención correctamente, es decir, para romper el escondite.


Si su clase Child también tuvo su propia mWords miembro, como en

class Child : public Base, public Foundation 
{ 
    int mWords 
    ... 

entonces este nombre podría ocultar la mWords heredada. El enfoque this->mWords en este caso no le ayudaría Para mostrar el nombre propio, y que tendría que utilizar el nombre calificado para resolver el problema

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

Si sus dos clases de base tuvieron un miembro de mWords , como en

class Base { 
public: 
    std::string mWords; 
    ... 
}; 

class Foundation { 
public: 
    int mWords; 
    ... 

continuación, en el nombre Child::DoSomethingmWords sería ambigua, y que tendría que hacer

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

para resolver la ambigüedad.


Pero, de nuevo, en su ejemplo específico, donde no hay ambigüedad y sin nombre que oculta todo esto es completamente innecesario.

+0

tiene sentido. ¡Gracias! –

0

creo que este es el método más común:

Write(mWords); 

a menos que corra en la ambigüedad.

Si hay ambigüedad o sombreado porque quiere algo en una clase base (particular) pero algo en otra clase base (o esta clase) lo oculta, entonces use la sintaxis Base::name.

Si una variable local está sombreando a uno de sus miembros, utilice this->, aunque en general debe intentar evitar esta situación. (Es decir: tratar de evitar nombrar los locales de tal manera que ensombrecen miembros)

supongo que una forma de verlo sería el uso de la primera de ellas que funciona y hace lo que quiere:

  1. name
  2. this->name
  3. Base::name
+0

sí, podría tener que lidiar con la ambigüedad ... Lo aclararé en mi publicación original. –

0

Puesto que no hay conflicto de nombres, basta con utilizar Write(mWords). Use los otros 2 si tiene variables locales que entran en conflicto o cuando los nombres están ocultos.

+0

Si hay un conflicto, ¿qué método recomienda que use? –

+0

y ¿a qué te refieres con "cuando los nombres están ocultos"? –

+0

si hay un conflicto entre las variables locales y las variables miembro (por ejemplo, su clase tiene una variable miembro 'i', y su método también usa una variable local' i'), use 'this'. si 'A' declara una función' f', y 'B' hereda' A' y declara 'f' también, y desea llamar a' A'''''''''''', 'Usado' f'. – lijie

Cuestiones relacionadas