saf sanal işlevlerin tanımlanması – 1

C++ dilinde taban sınıfların saf sanal işlevleri (pure virtual functions) kalıtım yoluyla elde edilecek sınıflara bir arayüz (interface) sunan ancak bir kod sağlamayan operasyonları temsil ediyor. En az bir saf sanal işleve sahip olan sınıflar soyut (abstract) olarak nitelendiriliyor. Soyut sınıflar türünden nesneler oluşturamıyoruz. Bu sınıfları yalnızca gösterici ve referans semantiği ile kullanabiliyoruz. Bir sınıf türünden nesneler oluşturmamız için bir sınıfın somut (concrete) olması gerekiyor. Soyut bir sınıftan kalıtım yoluyla elde edilecek bir sınıfın somut olabilmesi için taban sınıfının tüm saf sanal işlevlerini ezmesi (override etmesi) gerekiyor. Eğer türemiş sınıf, taban sınıfının tek bir saf sanal işlevini bile ezmez ise kendisi de soyut bir sınıf oluyor. Bir başka deyişle, taban sınıfların saf sanal işlevleri, kalıtımla elde edilecek somut sınıfları kod temin etmeye zorlayan işlevler. Aşağıdaki koda bakalım:

Abstract isimli sınıf soyut, çünkü func isimli saf sanal bir işlev bildirmiş. Abstract sınıfından public kalıtımı yoluyla türetilen AbstractToo sınıfı da Abstract sınıfının saf sanal func işlevini ezmediği için soyut. AbstractToo sınıfından yine public kalıtımı ile türetilen Concrete sınıfının func işlevini ezdiğini görüyorsunuz. Concrete bu durumda somut bir sınıf. main işlevi içinde x ve y isimli nesnelerin tanımı geçersiz. Soyut sınıflar türünden nesneler tanımlayamıyoruz. Ancak Concrete sınıfı türünden z isimli nesnenin tanımlanması geçerli.

Normal olarak saf sanal işlevleri tanımlamıyoruz. Amacımız türemiş sınıflara sadece bir arayüz sağlamak. Somut sınıflar saf sanal işlevleri ezerek yani bir kod sağlayarak söz konusu operasyonu somutlaştırmış oluyorlar. Ancak öyle durumlar var ki saf sanal bir işlevi bildirmekle kalmayıp aynı zamanda bu işlevi tanımlamamız gerekiyor. Bu yazı serisinin amacı saf sanal işlevlerin tanımlanmasını gerektiren senaryoları anlatmak. Serimizin her yazısı ayrı bir senaryoyu ele alacak.

saf sanal sonlandırıcı işlev (pure virtual destructor)

Tüm taban sınıfların sonlandırıcı işlevleri ya sanal ve public olmalı ya da eğer sanal olmayacak ise protected olmalı. Oluşturacağımız bir taban sınfın soyut olmasını istiyoruz ancak sınıfı soyut yapacak saf sanal bir işlev söz konusu değil. Bu durumda kullanılan tipik teknik sınıfın sonlandırıcı işlevinin saf sanal yapılması:

AbstractBase sınıfından kalıtım yoluyla elde edilecek somut sınıfların sonlandırıcı işlevleri derleyicinin ekleyeceği kod ile AbstractBase sınıfının sonlandırıcı işlevine çağrı yapacaklar. Eğer AbstractBase sınıfının saf sanal sonlandırıcı işlevi tanımlanmaz ise bağlama zamanında (link time) hata oluşacak:
Bu durumda AbstractBase sınıfının sonlandırıcı işlevinin bir koda sahip olmasa da tanımlanması gerekiyor:
Share

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun