Zum Inhalt springen

Zugriff auf private-Member aus abgeleiter Klasse (war: geht nicht)


Empfohlene Beiträge

Geschrieben

#include <iostream>

#include <cstdio>


using namespace std;


class fahrzeug

{

//private:

	//char name;

	//char marke;

	//double preis;

	//int kmh;

public:

	char name;

	char marke;

	double preis;

	int kmh;

	void virtual ausgabe_typ()= 0;

	void virtual ausgabe_daten()= 0;

};




class motorad:public fahrzeug

{

private:

	int ps;

	bool motor;

	int db;

public:

	void ausgabe_typ()

	{

		cout << marke;

	};

	void ausgabe_daten()

	{

		cout << ps;

		cout << motor;

		cout << db;

		cout << kmh;

	};

};


class AUTO:public fahrzeug

{

private:

	int ps;

	bool cat;

	char farbe;

public:

	void ausgabe_typ()

	{

		cout << marke;

	};

	void ausgabe_daten()

	{

		cout << ps;

		cout << cat;

		cout << farbe;

		cout << kmh;

	};

 };


main()

{

	fflush(stdin);

	//getcar();

}

das ist ein testprogramm und es geht einfach nicht das ich auf den privaten bereich meiner basisklasse zugreifen kann deswegen habe ich das alles in den publikbereich nochmal geschrieben und jetzt geht es, aber jetzt habe ich ja für jeden tür und tor geöffnet. das ist doch aber nicht sinn und zweck der sache, oder???

gibt es da keine andere lösung???

PS.: für die frechen kann ich nix, ich denk das sind die doppelpunkte, sorry

Geschrieben
das ist ein testprogramm und es geht einfach nicht das ich auf den privaten bereich meiner basisklasse zugreifen kann
Genau dafür ist private ja auch gedacht. Wenn der Zugriff aus einer abgeleiteten Klasse erlaubt sein soll, kannst du protected benutzen.

PS.: für die frechen kann ich nix, ich denk das sind die doppelpunkte, sorry
Nicht entschuldigen, sondern Code-Tags benutzen. Das hat den Nebeneffekt, dass die Einrückung nicht verlorengeht. Ich hab das mal für dich korrigiert. Und auch dein Threadtitel ist richtig schlecht, sozusagen in den Top Ten der schlechten Threadtitel. Auch das habe ich korrigiert. Bitte beim nächsten Mal selbst und gleich richtig machen.
Geschrieben

Wenn du private Member ändern willst, dann schreib doch nen Konstruktor für die Basisklasse mit den jeweiligen zu änderten Eigenschaften.

Ruf den dann in der abgeleiteten Klasse auf.

Auch wenn es bei Vererbung der Logik widerspricht:

du könntest die Klasse als Friend definieren, dann kannste die Member auch ändern...

Geschrieben

Hallo,

für das was du tun möchtest gibt es in C++ zusätzlich zu private und public noch die Zugriffsvariante protected. Auf diese Attribute und Methoden hat dann die Basisklasse und alle von ihr abgeleiteten Klassen Zugriff. Alle anderen müssen draußen bleiben.

Gruß

Nils

Geschrieben

mit dem protected das hab ich mal probiert und siehe da es geht, am anfang ist halt alles zu viel auf einmal, man weiß zwar so a bissel was es gibt bzw. weiß wo es steht aber ich weiß noch nicht wann ich was einsetzen muss bzw. kann.

danke euch trotzdem für eure zeit / mühe

mfg

Geschrieben
Wenn du private Member ändern willst, dann schreib doch nen Konstruktor für die Basisklasse mit den jeweiligen zu änderten Eigenschaften.

Ruf den dann in der abgeleiteten Klasse auf.

Auch wenn es bei Vererbung der Logik widerspricht:

du könntest die Klasse als Friend definieren, dann kannste die Member auch ändern...

Hallo,

wenn man keinen "Schreibzugriff" auf die Basisklasse hat, kann man auch mittels eines Speicherabbildes auf die privaten Member zugreifen. Der Nachteil ist aber die sehr enge Bindung zwischen Base und BaseImage, denn wenn sich bei Base etwas verändert, muss sich das Image anpassen, sonst funktioniert der reinterpret_cast nicht.


#include <iostream>

#include <string>


class base {

	public:

		base() : name("Hallo") {

		}


		virtual ~base() {

		}


	private:

		std::string name;

};


struct base_image {

	virtual ~base_image() {

	}


	std::string name;

};


class derived : public base  {

	public:

		derived() {

		}


		virtual ~derived() {

		}


		void print(std::ostream & out) const {

			base const * parent = static_cast<base const *>(this);

			base_image const * image = reinterpret_cast<base_image const *>(parent);

			out << image->name << std::endl;

		}

};


int main() {

	derived obj;

	obj.print(std::cout);


	return 0;

}

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...