[C++] Problem z dziedziczeniem

Napisałem taki prosty kod dotyczący dziedziczenia:

#include 


using namespace std;


class a

{

public:

	void wyswietl1()

	{

		cout << "Napis z klasy bazowej :)" << endl << endl;

	}

};


class b : public a

{

public:

	void wyswietl2()

	{

		cout << "Napis z klasy pochodnej :)" << endl << endl;

	}

};


int main()

{

	a *wsk = new b;


	wsk->wyswietl1();

	wsk->wyswietl2();


	system("pause");

	return 0;

}

Ale podczas próby kompilacji wyskakują błędy dotyczące wywołania metody wyswietl2(), która znajduję się w klasie pochodnej:

1>.\inheritance.cpp(28) : error C2039: 'wyswietl2' : is not a member of 'a'

1> .\inheritance.cpp(6) : see declaration of 'a'

Przecież to powinno działać !!

ach te obiekty. Na początku musisz zadeklarować obiekty :

b nowy=new b;

czy jakoś tak. Odwołuj się :

nowy.wyswietl1();

itp.

Jak wpisałem tak:

b *wsk = new b;

Wszystkie metody są wywoływane. Ale w kursie C++, z którego się uczę, pisze żeby deklarować tak jak to robiłem wcześniej:

a *wsk = new b;

Możliwe że jest błąd. Nie zapomnij zwolnić pamieci:

delete wsk
#include 


using namespace std;


class a

{

public:

   void wyswietl1()

   {

      cout << "Napis z klasy bazowej :)" << endl << endl;

   }

};


class b : public a

{

public:

   void wyswietl2()

   {

      cout << "Napis z klasy pochodnej :)" << endl << endl;

   }

};


int main()

{

   b wsk;

   b *sk;

   sk=&wsk;



   sk->wyswietl1();

   sk->wyswietl2();



   system("pause");

   return 0;

}

Przed tobą długa droga. Najpierw naucz się wskaźników. Z jakiego kursu korzystasz? – Dodane 11.02.2009 (Śr) 13:27

nie możesz tak zadeklarować bo a i b to dwa różne obiekty (mimo że b dziedziczy z a). to tak jak napisać int a = string b. kompilator tego nie przepuści. ponieważ to są dwa różne typy.

Korzystam z “Kursu C++. Od zera do gier kodera” Xiona.

tam są błędy (są problemy z działaniem programów). Też się z niego uczyłem. Fajny kurs. Polecam też Symfonię C++ jako uzupełnienie.

#include 

using namespace std;


class a

  {

   public:

   void wyswietl1() { cout << "Napis 1 z klasy bazowej :)" << endl << endl; }

   virtual void wyswietl2() { cout << "Napis 2 z klasy bazowej :)" << endl << endl; }

  };


class b:public a

  {

   public:

   void wyswietl1() { cout << "Napis 1 z klasy pochodnej :)" << endl << endl; }

   virtual void wyswietl2() { cout << "Napis 2 z klasy pochodnej :)" << endl << endl; } // tu virtual można pominąć

  };


int main()

  {

   b B;

   a *wsk=&B;

   a &ref=B;


   B.wyswietl1(); // Napis 1 z klasy pochodnej :)

   wsk->wyswietl1(); // Napis 1 z klasy bazowej :)

   ref.wyswietl1(); // Napis 1 z klasy bazowej :)

   ((b*)wsk)->wyswietl1(); // Napis 1 z klasy pochodnej :)

   ((b&)ref).wyswietl1(); // Napis 1 z klasy pochodnej :)


   B.wyswietl2(); // Napis 2 z klasy pochodnej :)

   wsk->wyswietl2(); // Napis 2 z klasy pochodnej :)

   ref.wyswietl2(); // Napis 2 z klasy pochodnej :)


   cin.get();

   return 0;

  }