Wskaźnik z klasy bazowej na pochodną

0

Witam mam pewien problem i nie mogę znaleźć rozwiązanie w tym kodzie:

#include <iostream>
#include <conio.h>

class Cfigures
{
};

class Ctriangle : public Cfigures
{
private:
	int side;
	double height;
public:
	Ctriangle(int s) { side = s; }
	double sheight() { return side * sqrt(3) / 2; }
	int sside() { return side; }
};

class Crectangle : public Cfigures
{
private:
	int sidex;
	int sidey;
public:
	Crectangle(int x, int y) { sidex = x; sidey = y; }
	int field() { return sidex * sidey; }
	int ssidex() { return sidex; }
	int ssidey() { return sidey; }
};

int main()
{
	Ctriangle *wskt = new Ctriangle(3);
	std::cout << "Dlugosc boku trojkata wynosi:" << wskt->sside() << std::endl;
	std::cout << "Wysokosc trojkatu wynosi:" << wskt->sheight() << std::endl << std::endl;
	Crectangle *wskr = new Crectangle(5, 3);
  	std::cout << "Dlugosci bokow prostokata wynosza \nx=" << wskr->ssidex() << "\ny=" << wskr->ssidey();
	_getch();
	delete wskt, wskr;
	return 0;
}

chcę mieć aby jeden wskaźnik wskazywał najpierw na obiekt klasy Ctriangle, a następnie wskazywał na obiekt klasy Crectangle.
Jak stworzę wskaźnik typu Cfigure to wtedy i tak nie mogę wskazać na obiekt klasy pochodnej

Cfigure *wsk = new Ctriangle(7); // IDE pokazuje mi że wskaźnik wsk wskazuje na Cfigure
std::cout << wsk->ssidex(); // nie działa, IDE podpowiada mi że Ctriangle nie jest członkiem Cfigure  

Gdzieś czytałem ze np. klasa która dziedziczy jest tym co dziedziczy ale klasa od której się dziedziczy nie musi być tym co ją dziedziczy, a wiec tworząc wskaźnik typu Cfigure nie rezerwuje pamięci dla klas które dziedziczą od jej ale polecenie:

Cfigure *wsk = new Ctriangle(7); 

nie powinno rezerwować pamięć dla Ctriangle?????

Sorry za lanie wody. . .

A więc w skrócie:
Czy da się stworzyć wskaźnik który będzie mógł wskazywać najpierw na trójkąt, a potem na prostokąt?

takie coś nie działa

 Ctriangle t(4);
Crectangle r(3,5);
Cfigure *wsk;
wsk = &t; // lub *wsk = t;
wsk->sside(); // to zadziała
wsk = &r; // moment błędu
wsk->ssidex(); // nie działa

Za pomoc dziękuję.

1

#Nie rozumiem belkotu.
#Nazywaj klasy liczba pojedyncza
#Twoje dziedziczenie nie ma sensu. Dziedziczenie ma sens, jesli klasa bazowa udostepnia jednolity interfejs publiczny.

2

Może to ci pomoże: http://ideone.com/AI1Uan

0
n0name_l napisał(a):

#Nie rozumiem belkotu.
#Nazywaj klasy liczba pojedyncza
#Twoje dziedziczenie nie ma sensu. Dziedziczenie ma sens, jesli klasa bazowa udostepnia jednolity interfejs publiczny.

  1. Jeżeli nie rozumiesz bełkotu to lepiej nic nie pisz.
  2. Dzięki za uwagi z języka polskiego.
  3. Czy zadałem pytanie: Czy moje dziedziczenie ma sens???

_13th_Dragon
gdy usunę komentarz :

wsk->sside();  // to zadziaÅa, chrzani waÅÄ poczytaj co pisze kompilator

mam błąd taki jaki miałem wcześniej... czyli nie działa
1>c:\x\source.cpp(40): error C2039: 'sside' : is not a member of 'Cfigure'
1>c:\x\source.cpp(8) : see declaration of 'Cfigure'

ale

_13th_Dragon dzięki za pomoc. Twój sposób wywołania metody działa czyli:

((Ctriangle*)wsk)->sside();

a mój czyli wsk->sside() nie działa.
Ok problem rozwiązany.
Jeszcze raz dzięki Dragon.

0
  1. Jeżeli nie rozumiesz bełkotu to lepiej nic nie pisz.

Lepiej dla kogo? Jeszcze ktos nie daj boze pomysli, ze tak sie pisze.

  1. Dzięki za uwagi z języka polskiego.

Bloga ignorancja.

  1. Czy zadałem pytanie: Czy moje dziedziczenie ma sens???

Zadales pytanie "Jak mlotem pneumatycznym wkrecic srube".

0

I znowu spamujesz, już widzę twoje posty 80% to spam.
A kto tutaj będzie się uczył pisowni? No chyba ty.
To że się ktoś pomylił w jednym słowie to od razu nie musisz jego wytykać.
No ale co tam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1