2010-09-01 20 views
18

Entonces, hoy encontré esta cita, ¿alguien puede explicarlo?C++, base virtual abstracta protegida virtual virtual privado destructor

"Si cree que C++ no es demasiado complicado, sólo lo que es una base virtual pura destructor privada virtual abstracto protegida y cuándo fue la última vez que necesitaba una - Tom Cargill"

+6

¿Puedo etiqueta este "departamento de departamento de redundancia"? ¿Por favor? –

+5

Estas palabras parecen tener sentido, pero no realmente. También unir dos elementos diferentes para intentar y complicar más las cosas es una señal de que el autor solo trata de confundir a las personas para tratar de hacer una observación que no está realmente allí. Debemos tener en cuenta que cada situación es única y que usted construye su jerarquía de clases y destructores según lo requiera la situación. Llamar al lenguaje demasiado complicado porque proporciona facilidades es una tontería. Es como decir cuál es el punto de la herencia privada. Sí, normalmente no vas a usarlo, pero habrá una ocasión en que es bueno tenerlo. –

+2

No pienso en el destructor privado virtual puro basado en la base virtual abstracta protegida y cuándo fue la última vez que necesitó uno. Creo que 1) Mi clase es abstracta 2) El destructor tiene que ser virtual. 3) Pero no necesito una implementación así que es pura 3) Utilizaré la herencia protegida. –

Respuesta

16

Creo que es una privado virtual destructor privado (creo que esa parte se explica por sí misma) que es parte de una clase base abstracta, que has usado a través de protegido virtual herencia. .

class Base 
{ 
    private: 
     virtual ~Base() = 0; /* A */ 
}; 

class Derived : protected virtual Base 
{ 
    private: 
    ~Derived() {.......} /* B */ 
}; 

Desde el punto de vista de la etiqueta B, la línea en la etiqueta A es una "base abstracta virtual pura destructor protegida privada virtual",

Cada una de esas tres partes tiene su utilidad individual. No conozco un patrón de diseño que requiera las tres partes anteriores, pero no hay nada que impida su uso conjunto.

+2

Eso es un error de compilación, ¿verdad? Debido a que en la herencia virtual, el destructor para la base virtual debe ser llamado por el destructor más derivado, pero '~ Derived()' no tiene acceso a '~ Base()'. (NB: El hecho de que '~ Base()' sea * puramente virtual * no significa que no haya cuerpo). –

+0

@BenVoigt: C++ _es_ raro. En realidad, puede tener los métodos declarados como puros ('= 0') y aún tener definición y ser invocable. Que es exactamente lo que sucede con un destructor como este, ya que siempre obtiene al menos la definición generada automáticamente. –

+0

@James Curran: buena respuesta. Me gusta !!! – Destructor

3

No estoy seguro del contexto original, pero supongo que alguien podría decir que C++ es menos complicado que un lenguaje como Java. El punto de Tom es que C++ tiene suficientes características para que puedas construir fácilmente una construcción MUY complicada.

0

Básicamente, él simplemente reunió un montón de palabras y las unió sin darse cuenta de que realmente se refieren a cosas diferentes, o a menudo, lo mismo.

protected abstract virtual base 

Pretty simple.

class Base { // BASE 
    virtual something() = 0; // ABSTRACT 
}; 
class Derived : protected virtual Base { // PROTECTED VIRTUAL 
}; 

pura destructor privada virtual

también bastante simple.

class Base { // BASE 
private: 
    virtual ~Base() = 0; // pure virtual, private, destructor 
}; 
class Derived : Base { 
}; 

Por supuesto, pure virtual es lo mismo que abstract.

Es una hipérbole completamente clara y completa escrita por alguien que no tiene ni idea de lo que está hablando.

+3

Creo que Tom Cargill tiene una idea razonable de qué las palabras significan. Ver: http://www.amazon.com/C-Programming-Style-Tom-Cargill/dp/0201563657 – janm

+0

@janm: Que él sepa lo que significan las palabras, no implica que haya tenido cuidado al engarzarlas . En particular, todos los que han intentado que funcione (incluido el famoso Scott Meyers, citado en la respuesta del BR41N) han producido código ilegal. * Puede * funcionar, pero se requiere una declaración de 'clase de amigo'. –

2

Estas palabras parecen tener sentido pero no realmente.

También unir dos atributos diferentes juntos en un intento de complicar demasiado las cosas es una señal de que el autor está tratando de confundir a las personas para intentar y hacer un punto que realmente no existe.

Debemos tener en cuenta que cada situación es única y que usted construye su jerarquía de clases y destructores según lo requiera la situación. Llamar al lenguaje demasiado complicado porque proporciona facilidades es una tontería. Es como decir cuál es el punto de la herencia privada. Sí, normalmente no vas a usarlo, pero habrá una ocasión en que es bueno tenerlo.

Además no creo de:

protegida base virtual abstracto puro destructor privada virtual y cuándo fue la última vez que necesitaba una

pienso:

  1. Mi clase es abstracta
  2. El destructor tiene que ser virtual.
  3. Pero no necesito una implementación por lo que su pura
  4. voy a utilizar la herencia protegida
+0

Pure virtual no significa que la clase no necesita una implementación, significa que las subclases deben proporcionar una implementación (y la clase también puede hacerlo si lo desea). – KayEss