Dziedziczenie klasy TShape

0

Witam
Potrzebuje zrobić udoskonaloną wersję TShape , i nie mogę poradzić sobie z odziedziczeniem funkcji publicznych tego TShapa. Mój kod:

class Ball
{   private:
        TShape *ball;
    public:
        Ball(void);

};
 Ball::Ball(void)
 {  ball = new TShape(Form1);
    ball->Parent = Form1;
    ball->Shape = stCircle;
    ball->Height = 50;
    ball->Width = 50;
    ball->Left = 200;
    ball->Top = 180;
    ball->Brush->Color = clYellow;
    ball->Visible = true;
 }

Ball *pilka1;

gdy wpisuję class Ball:public TShape mam błąd.
W jaki sposób moge odziedziczyć metody i funkcję tego Tshapa??
Pozdro

0

Co, tak nie przechodzi?

class Ball: public TShape
{  
    ...

    public:
        Ball(Classes::TComponent* owner);

};

Ball::Ball(Classes::TComponent* owner)
    :TShape(owner)
{
    ...
}
0

Niestety nie wyskakuje błąd:

[C++ Error] Unit1.cpp(18): E2113 Virtual function 'Ball::Ball(TComponent *)' conflicts with base class 'TShape'

w miejscu:

public:
        Ball(Classes::TComponent* owner);
0

Dodaj __fastcall do konstruktora.

0

Przerobiłem program tak:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TShape *pilka;

class Ball: public TShape
{   private:
        TShape *ball;
    public:
       __fastcall Ball(Classes::TComponent* owner);
      Ball(void);

};
__fastcall Ball::Ball(Classes::TComponent* owner)
    :TShape(owner)
 {  ball = new TShape(Form1);
    ball->Parent = Form1;
    ball->Shape = stCircle;
    ball->Height = 50;
    ball->Width = 50;
   // ball->Left = 200;
    ball->Top = 180;
    ball->Brush->Color = clYellow;
    ball->Visible = true;
 }


Ball *pilka1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        pilka1 = new Ball(Form1);
        pilka1->Brush->Color = clBlue;
        pilka1->Left = 20;
        pilka1->Top = 20;
        pilka1->Visible = true;
        pilka1->Parent = Form1;


}
//---------------------------------------------------------------------------

Ale teraz program tworzy obiekt (kwadrat) pomimo że w kontruktorze dałem żeby to było koło i w ogóle. Jak ktoś wie co zrobić to proszę o pomoc
Pozdro

0

A co ta część ma wspólnego z dziedziczeniem?

ball = new TShape(Form1);
ball->Parent = Form1;
ball->Shape = stCircle;
ball->Height = 50;
ball->Width = 50;
// ball->Left = 200;
ball->Top = 180;
ball->Brush->Color = clYellow;
ball->Visible = true;

Jak już to:

__fastcall Ball::Ball(Classes::TComponent* owner)
    :TShape(owner)
{
    Shape = stCircle;
}
0

Tutaj ustalam sobie w konstruktorze, tak abym po wpisaniu np

Ball *pilka;
pilka = new Ball(Form1);

Miał ten obiekt w określonym miejscu i bym nie musiał pisać jakiej jest wielkości.
Jeżeli źle myślę to mnie popraw. W każdym razie potrzebuje zmodyfikowanej wersji TShape , do którego dorzucę jeszcze jakieś swoje funkcje.
Pozdro i prosze o szybką odpowiedź

0

Ale ja pisałem o tym:

__fastcall Ball::Ball(Classes::TComponent* owner)
    :TShape(owner)
 {  ball = new TShape(Form1);
    ball->Parent = Form1;
    ball->Shape = stCircle;
    ball->Height = 50;
    ball->Width = 50;
   // ball->Left = 200;
    ball->Top = 180;
    ball->Brush->Color = clYellow;
    ball->Visible = true;
 }

po co tworzysz obiekt TShape (ball) wewnątrz pochodnej z TShape, przecież Ball dziedziczy właściwości po TShape?

0

Ale bez
ball = new TShape(Form1);
Nie ruszy. O ile o to chodziło

0

Jak nie ruszy?

0

ponieważ ball ma wartość NULL

0

:/ Wywal to ball (i wszystko co z nim związane) z klasy Ball, jest niepotrzebne.

0

CHyba się nie zrozumieliśmy. Ja po to chcę to zrobić aby potem po napisaniu
pilka = new ball
mieć już obiekt który będzie okrągły i koloru żóltego. Więc po co mam usunąć w konstruktorze ball skoro jest on w private i na nim działam???

0

Więc po co mam usunąć w konstruktorze ball skoro jest on w private i na nim działam???

Może dlatego, że masz napisane w temacie dziedziczenie plus:

i nie mogę poradzić sobie z odziedziczeniem funkcji publicznych tego TShapa [...] W jaki sposób moge odziedziczyć metody i funkcję tego Tshapa??

więc może zastanów się, co chcesz zrobić, a później jasno sformułuj pytanie. Jak chcesz mieć sobie klasę Ball, która zawiera wskaźnik na obiekt TShape, to po kiego grzyba odwołujesz się do obiektu w ten sposób?!

pilka1 = new Ball(Form1);
pilka1->Brush->Color = clBlue;
pilka1->Left = 20;
pilka1->Top = 20;
pilka1->Visible = true;
pilka1->Parent = Form1;

Przecież klasa Ball nie odziedziczyła żadnych właściwości TShape i nie posiada żadnych metod/właściwości, do których mógłbyś odwołać się w ten sposób.

0

dawiddawido, #$#%#!!
wszyscy cię rozumieją, tylko ty jesteś nierozumny.
no szlag, tak trudno wypi...lić to ball? Mieszasz dziedziczenie z kompozycją. Przeczytaj cokolwiek o dziedziczeniu, albo zrób, co ci 0x666 mówi, do jasnej anielki [glowa]
Nawet ci napisał, jak w konstruktorze zmieniać odziedziczone właściwości.;

0

Sorry , trochę się w tym wszystkim pogubiłem. Więc tak
Potrzebuje klase która będzie mi tworzyć obiekt, taki jak TShape, tylko że w konstruktor będzie od razu nadawał temu obiektowi kształt kółka i kolor żółty. Dzięki temu będę mógł dodać swoją funkcje, i takie tam, ale obiekt dalej będzie przypominał TShapa (te same odwołania, np. ->Brush->Color itd.)
Jeżeli ktoś mógłby mi napisać jak to zrobić to będę wdzięczny (najlepiej całą klase, żebym się nie pogubił;)
Mam nadzieję że napisałem mniej więcej zrozumiale. Proszę się także nie wściekać;)
Bardzo tego potrzebuje, bo muszę oddać pewien program jutro, a bez tego ani rusz
Pozdrawiam

0

No ok, odpowiedź w zasadzie już dostałeś.

0

ok już sobie poradziłem
Sorry , jaki ja głupi byłem ;)
Przecież kolor zmieniam left poprzez Left = 20, a kolor Brush->Color

Pozdrawiam

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