2011-04-06 24 views
10

Acabo de querer aclarar algo. ¿Las clases base abstractas nunca deben tener miembros privados? Por ejemploC++ miembros privados de la clase base abstracta

class abc{ 
public: 
    virtual void foo()=0; 
private: 
    int myInt; 
} 

nunca se puede acceder a myInt ya no se puede crear una instancia de abc y no va a estar en una clase derivada desde su privado. ¿Hay alguna situación en la que use miembros privados en clases base abstractas o es simplemente incorrecto?

+0

Un miembro privado de esa manera no tiene sentido en una clase abstracta, del mismo modo que no tiene sentido en * cualquier otra * clase. –

+0

@MartinhoFernandes: ¿Estás diciendo que los miembros de datos privados nunca tienen sentido o estás diciendo algo sobre 'int' o' myInt' en particular? –

+0

Estoy diciendo que los miembros de datos privados que no se usan * en ningún lado * no tienen sentido.'class abc {public: virtual void foo() {};/* ya no es abstracto */private: int myInt; 'no hace que myInt sea más útil. –

Respuesta

12

En C++ puede tener una clase abstracta que tenga métodos virtuales no puros. En ese caso, y dependiendo del diseño puede tener sentido que los miembros privados:

class base { 
    std::string name; 
public: 
    base(std::string const & n) : name(n) {} 
    std::string const & getName() const { return name; } 

    virtual void foo() = 0; 
}; 

Ese código se asegura de que todos los objetos que se deriva de base tiene un nombre, que se establece durante la construcción y nunca cambia durante la vida del objeto.

EDITAR: Para finalizar después de que Charles Bailey me recordó que en su answer

También puede definir funciones puras virtual, y en ese caso, los atributos privados también podría tener sentido:

// with the above definition of base 
void base::foo() { 
    std::cout << "My name is " << name << std::endl; 
} 
0

Tal como está, su ejemplo no tiene sentido.

Sin embargo, las clases base abstractas pueden tener definiciones de funciones miembro, que a su vez pueden acceder a datos de miembros privados en la clase base.

1

No todos los métodos en una clase base abstracta deben ser puramente virtuales. Es posible que tenga algunos métodos que son útiles para todas las subclases. Por lo tanto, si tiene alguna funcionalidad en la clase base que está modificando el estado interno, tendría miembros privados para eso.

2

Normalmente no es aconsejable tener miembros de datos en una clase abstracta pero no hay nada técnicamente incorrecto en su ejemplo. En la implementación de foo, que es de acceso público, puede usar myInt para los fines que desee.

Por ejemplo:

class abc{ 
public: 
    virtual void foo()=0; 
private: 
    int myInt; 
}; 

class xyz : public abc 
{ 
    virtual void foo(); 
}; 

#include <iostream> 
#include <ostream> 

void xyz::foo() 
{ 
    std::cout << "xyz::foo()\n"; 
    abc::foo(); 
} 

void abc::foo() 
{ 
    std::cout << "abc::foo(): " << myInt++ << '\n'; 
} 

#include <memory> 

int main() 
{ 
    std::auto_ptr<abc> p(new xyz()); // value-initialization important 
    p->foo(); 
    p->foo(); 
} 

Salida:

xyz::foo() 
abc::foo(): 0 
xyz::foo() 
abc::foo(): 1 
+0

No inicializa la variable '' 'myInt''' en el constructor' '' abc''' - ¿es normal? :) – isnullxbh

-5

Se puede acceder a miembros privados a través de esta forma de acceso directo

Código es en PHP

abstract class myclass1 
{ 
      private $var="46789"; 
     public function test($valuetoset) 
     { 
      echo $this->var = $valuetoset; 

     } 
} 

class myclass2 extends myclass1 
{ 


} 

$obj = new myclass2(); 
$obj->test(78); 
Cuestiones relacionadas