C++ Bir Dizi Türetme Yapılması Durumu

cders-153Türetme işlemi birden fazla yapılabilir Bu durumda yukarıdaki sınıflar aynı kurallarla aşşağıdan erişilebilir. Bir sınıfın bir dizi türetme yapıldığında bir üsteki taban sınıfına doğrudan tan sınıf (direct base class) sonraki taban sınıflarına ise dolaylı taban sınıf (indirect base class) denir. Bir sınıf birden fazla sınofa taban sınıf olabilir. Bu durum çatışmaya yol açmayacak biçimde açık ve anlaşılır bir türetme durumudur. 

 c7

 

 Ancak bir sınıffın birden fazla taban sınıfa sahip olması ayrı bir bölümde incelenecek kadar karmaşık bir konudur. Bu duruma çoklu türetme denir. Çoklu türetme diğer bilgisayar dillerinde desteklenmemektedir.    

c8

Taban Sınıf Türünden Göstericilere Türemiş Sınıf Nesnelerinin Adreslerinin Atanması

 

C++’ta bir göstericiye farklı türden bir göstericinin atanması uyarı deÄŸil error gerektirir. Ancak istisna olarak taban sınıf türünden bir göstericiye türemiÅŸ sınıf türünden bir nesnenin adresi atanabilir. Ancak bunun tersi olan durum, yani türemiÅŸ sınıf türünden bir göstericiye taban sınıf türünden bir nesnenin adresinin atanması durumu yararlı ve geçerli bir iÅŸlem deÄŸildir.

 

class A {

..

..

};

 

class B:public A {

..

..

};

 

void main(void)

{

            A *p;   /*Taban sınıf türünden bir gösterici*/

            B x;     /*Türemiş sınıf türünden nesne*/

            A y;     /*Taban sınıf türünden bir nesne*/

            B *t;    /*Türemiş sınıf türünden bir gösterici*/

 

            p = &x;           /*Geçerli*/

            t = &y;                        /*Geçersiz*/

}

 

Türemiş sınıf nesnesi taban sınıf veri elemanlarını içerdiğine göre türemiş sınıf nesnesinin adresi taban sınıf göstericisine geçirildiğinde problemli ya da güvensiz bir durum oluşmaz. Derleyici bu durumda türemiş sınıf nesnesinin taban sınıf veri elemalarının adresini göstericiye atar. Taban sınıf göstericisiyle ancak taban sınıf üye fonksiyonları çağırılabileceğine göre bu göstericiyle tahsis edilmiş bir alana erişilir, yani uygunsuz bir durum oluşmaz. Mademki taban sınıf ve türemiş sınıf veri elemanlarının yerleşimi kesin bir standartla belirlenmemiştir, böyle bir atamada derleyici türemiş sınıf nesnesinin taban sınıf elemanlarının başlangıç adresini tespit edip o adresi atamalıdır. Tabii genellikle taban sınıf veri elemanları düşük anlamlı adrese yerleştirildiğinden geçirilen adres de nesnenin bütününün başlangıç adresi olur.

 

/*—–tabangos.cpp—–*/

#include <stdio.h>

 

class A {

        int a;

    public:

        A(int x = 0)

        {

            a = x;

        }

        void DispA(void);

        void SetA(int x)

        {

            a = x;

        }

};

 

class B : public A {

        int b;

    public:

        B(int x = 0, int y = 0): A(y)

        {

            b = x;

        }

        void DispB(void);

        void SetB(int x)

        {

            b = x;

        }

};

 

void A::DispA(void)

{

    printf(”%d\n”, a);

}

 

void B::DispB(void)

{

    printf(”%d\n”, b);

}

 

void main(void)

{

    A *p;

    B x(10, 20);

 

    p = &x;

    p -> DispA();

    p -> SetA(50);

    p -> DispA();

}

/*————————*/

 

Örnek:C B’den, B A’dan türemiÅŸ sınıflardır:

 

{

            B *p;

            C n;

 

            p = &n;           /*Geçerlidir, p’ye A’nın baÅŸlangıç adresi, geçirilir*/

}

Kategoriler: C++ Programlama, Yazılım

Tags: , , ,

Yorumlar

Yorum Yok

Yorumunuzu Ekleyin

Yorum eklemek için giris yapmalısınız.