Menu
Coddy logo textTech

Çoklu Kalıtım

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 104.

C++, bir sınıfın aynı anda birden fazla temel sınıftan miras almasına izin verir. Buna çoklu kalıtım denir ve farklı sınıf hiyerarşilerinden özellikleri birleştirmenize olanak tanır.

Birden fazla sınıftan kalıtım almak için onları virgülle ayırın:

class Printer {
public:
    void print() {
        std::cout << "Printing document" << std::endl;
    }
};

class Scanner {
public:
    void scan() {
        std::cout << "Scanning document" << std::endl;
    }
};

class MultiFunctionDevice : public Printer, public Scanner {
public:
    void copy() {
        scan();
        print();
    }
};

MultiFunctionDevice sınıfı artık hem Printer hem de Scanner sınıflarının metotlarına erişebilir:

MultiFunctionDevice mfd;
mfd.print();  // Printer sınıfından
mfd.scan();   // Scanner sınıfından
mfd.copy();   // Kendi metodu

Yapıcılar (constructors), temel sınıfların kalıtım bildiriminde listelendiği sırayla (soldan sağa) çağrılır ve yıkıcılar (destructors) ters sırayla çağrılır. Başlatma listesinde her bir temel yapıcıya argümanlar iletebilirsiniz:

class MultiFunctionDevice : public Printer, public Scanner {
public:
    MultiFunctionDevice() : Printer(), Scanner() {}
};

Her iki temel sınıfın da aynı ada sahip bir üyesi olduğunda potansiyel bir sorun ortaya çıkar. Bu durum belirsizlik (ambiguity) yaratır ve hangisini kastettiğinizi belirtmek için kapsam çözünürlük operatörünü kullanmanız gerekir:

class A { public: void show() {} };
class B { public: void show() {} };
class C : public A, public B {};

C obj;
obj.A::show();  // A'nın sürümünü çağır
obj.B::show();  // B'nin sürümünü çağır

Çoklu kalıtım güçlüdür ancak özellikle temel sınıflar ortak bir atayı paylaştığında karmaşık durumlara yol açabilir. Bu zorluğu bir sonraki derste inceleyeceğiz.

challenge icon

Görev

Kolay

Birden fazla temel sınıfın yeteneklerini çoklu kalıtım kullanarak birleştiren bir akıllı ev cihazı sistemi oluşturalım. Hem WiFi'a bağlanabilen hem de sesle kontrol edilebilen cihazlar oluşturacak, ardından bu özellikleri birleşik bir akıllı hoparlörde bir araya getireceksin.

Kodunu üç dosya arasında düzenleyeceksin:

  • WiFiDevice.h: Bir ağa bağlanabilen herhangi bir cihazı temsil eden bir WiFiDevice sınıfı tanımla:
    • Korumalı bir std::string networkName üyesi
    • Bir ağ adı alan ve bunu saklayan bir kurucu
    • Şunu yazdıran herkese açık bir connect() yöntemi: Connecting to WiFi: <networkName>
    • Şunu yazdıran herkese açık bir status() yöntemi: WiFi Status: Connected
  • VoiceControl.h: Ses özelliklerine sahip herhangi bir cihazı temsil eden bir VoiceControl sınıfı tanımla:
    • Korumalı bir std::string assistantName üyesi
    • Bir asistan adı alan ve bunu saklayan bir kurucu
    • Şunu yazdıran herkese açık bir listen() yöntemi: <assistantName> is listening...
    • Şunu yazdıran herkese açık bir status() yöntemi: Voice Status: Active
  • main.cpp: Üç girdi oku (her biri ayrı bir satırda):
    1. Cihaz adı (dize)
    2. WiFi ağ adı (dize)
    3. Sesli asistan adı (dize)

    SmartSpeaker ve WiFiDevice sınıflarının her ikisinden de herkese açık olarak kalıtım alan bir VoiceControl sınıfı tanımla:

    • Özel bir std::string deviceName üyesi
    • Üç parametrenin tümünü alan, başlatma listesi kullanarak ağ adını WiFiDevice'e ve asistan adını VoiceControl'e aktaran ve cihaz adını saklayan bir kurucu
    • Şunu yazdıran, ardından powerOn() ve <deviceName> powering on... yöntemlerini çağıran bir connect() yöntemi: listen()
    • Cihaz adını yazdıran, ardından belirsizliği çözmek için kapsam çözümleme operatörünü kullanarak her iki showAllStatus() yöntemini çağıran bir status() yöntemi

    Girdi değerleriyle bir SmartSpeaker nesnesi oluştur. powerOn() yöntemini çağır, boş bir satır yazdır, ardından showAllStatus() yöntemini çağır.

Örneğin, girdiler Echo, HomeNetwork ve Alexa olduğunda:

Echo powering on...
Connecting to WiFi: HomeNetwork
Alexa is listening...

Echo Status:
WiFi Status: Connected
Voice Status: Active

showAllStatus() yöntemi, cihaz adının ardından bir satırda " Status:" yazdırmalı, sonra belirsizliği önlemek için her temel sınıfın status() yöntemini WiFiDevice::status() ve VoiceControl::status() kullanarak çağırmalıdır; çünkü her iki temel sınıf da aynı ada sahip bir yönteme sahiptir.

Kendin dene

#include <iostream>
#include <string>
#include "WiFiDevice.h"
#include "VoiceControl.h"

using namespace std;

// TODO: Hem WiFiDevice hem de VoiceControl sınıflarından genel (public) olarak türetilen SmartSpeaker sınıfını tanımlayın
// - Özel (private) üye: deviceName (string)
// - Yapıcı (Constructor): deviceName, networkName, assistantName parametrelerini alır
//   networkName değerini WiFiDevice sınıfına ve assistantName değerini VoiceControl sınıfına aktarmak için başlatma listesini (initialization list) kullanın
// - powerOn() metodu: "<deviceName> powering on..." yazdırır, ardından connect() ve listen() metodlarını çağırır
// - showAllStatus() metodu: "<deviceName> Status:" yazdırır, ardından her iki status() metodunu da çağırır
//   kapsam çözünürlüğü (scope resolution) kullanarak (WiFiDevice::status() ve VoiceControl::status())

class SmartSpeaker {
    // TODO: SmartSpeaker sınıfını burada uygulayın
};

int main() {
    string deviceName, networkName, assistantName;
    getline(cin, deviceName);
    getline(cin, networkName);
    getline(cin, assistantName);

    // TODO: Girdi değerleriyle bir SmartSpeaker nesnesi oluşturun
    // TODO: powerOn() metodunu çağırın
    // TODO: Boş bir satır yazdırın
    // TODO: showAllStatus() metodunu çağırın

    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi