No se que quieres lograr con:
Perro benji = Perro("chanda","blanco", 5);
Con Perro benji estas creando un Objeto de tipo Perro se puede decir que es una copia de Perro.
Con Perro("chanda","blanco", 5); intentas acceder sin crear el objeto, es como pillar la clase directo invocar su constructor y pasas ("chanda","blanco", 5). No se si eso es posible normalmente se trabaja sobre objetos y no propiamente la clase en si.
Pero si fuera posible es perfectamente comprensible el por que tienes 3 destructores. Tienes 3 destructores por que uno pertenece a Perro, otro a benji y otro a toby.
Como dije antes cuando haces Perro benji has creado en memoria una copia de Perroi con todos sus métodos y atributos incluido constructores y destructores pero estos últimos pasan a tener el nombre del objeto creado.
En vez de hacer:
Perro benji = Perro("chanda","blanco", 5);
Prueba: Perro benji ("chanda","blanco", 5);
Cuando creas un objeto, ese ya no lleva el nombre de la clase(Perro) sino su propio nombre, o sea que si el constructor de la clase Perro es Perro("chanda","blanco", 5); el constructor de benji es su propio nombre
benji("chanda","blanco", 5);
Prueba Esto:
Código C++:
Ver original#include <iostream>
#include <stdlib.h>
using namespace std;
class Perro {
public:
Perro ( string unaRaza, string unColor, int unaEdad ) {
suRaza = unaRaza;
suColor = unColor;
suEdad = unaEdad;
cout << suRaza << " creado!" << endl;
}
~Perro() { cout << suRaza << " destruido\n"; }
void ladrar () const;
void sentarse() const;
void getinfo() const;
private:
string suRaza, suColor;
int suEdad;
};
void Perro::ladrar() const {
cout << "guau guau guau";
}
void Perro::sentarse() const {
cout << "que descanso";
}
void Perro::getinfo() const {
cout << "La raza es: " << suRaza << endl;
cout << "El color es: " << suColor << endl;
cout << "La edad es: " << suEdad << endl;
}
int main () {
Perro( "papanatas", "trasparente", 100 );
Perro benji ( "chanda", "blanco", 5 );
Perro toby ( "pastor aleman", "negro", 3 );
cin.ignore();
}