Menu
CoddyTech

Ç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 olanak tanır. Buna çoklu kalıtım denir ve farklı sınıf hiyerarşilerindeki özellikleri birleştirmeni sağlar.

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

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 yöntemlerine erişebiliyor:

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

Yapıcılar, kalıtım bildiriminde taban sınıfların listelendiği sırayla (soldan sağa) çağrılır; yıkıcılar ise ters sırayla çağrılır. Başlatma listesinde her taban sınıfın yapıcısına argümanlar geçirebilirsin:

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 olası bir sorun ortaya çıkar. Bu durum belirsizlik yaratır ve hangi üyeyi kastettiğini belirtmek için kapsam çözümleme işleçini kullanmalısın:

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 üst sınıfı paylaştığında karmaşık durumlara yol açabilir. Bir sonraki derste bu zorluğu inceleyeceğiz.

challenge icon

Görev

Kolay

Çoklu kalıtım kullanarak birden fazla temel sınıfın özelliklerini birleştiren bir akıllı ev cihazı sistemi oluşturalım. Hem WiFi ağına 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 üç dosyaya ayıracaksın:

  • WiFiDevice.h: Bir ağa bağlanabilen her türlü cihazı temsil eden bir WiFiDevice sınıfı tanımla:
    • Korunan bir std::string networkName üyesi
    • Ağ adını parametre olarak alan ve 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 her türlü cihazı temsil eden bir VoiceControl sınıfı tanımla:
    • Korunan bir std::string assistantName üyesi
    • Asistan adını parametre olarak alan ve 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)

    Hem WiFiDevice hem de VoiceControl sınıflarından herkese açık şekilde kalıtım alan bir SmartSpeaker sınıfı tanımla:

    • Özel bir std::string deviceName üyesi
    • Üç parametrenin tümünü alan; başlatma listesiyle ağ adını WiFiDevice sınıfına, asistan adını VoiceControl sınıfına aktaran ve cihaz adını saklayan bir kurucu
    • Şunu yazdıran, ardından connect() ve listen() yöntemlerini çağıran bir powerOn() yöntemi: <deviceName> powering on...
    • Cihaz adını yazdıran, ardından belirsizliği gidermek için kapsam çözümleme operatörünü kullanarak her iki status() yöntemini de çağıran bir showAllStatus() 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ı ve ardından aynı satırda " Status:" ifadesini yazdırmalı; sonra her iki temel sınıfta da aynı ada sahip bir yöntem bulunduğundan belirsizliği önlemek için her temel sınıfın status() yöntemini WiFiDevice::status() ve VoiceControl::status() kullanarak çağırmalıdır.

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 public olarak miras alan SmartSpeaker sınıfını tanımla
// - Private üye: deviceName (string)
// - Constructor: deviceName, networkName, assistantName parametrelerini alır
//   networkName değerini WiFiDevice sınıfına ve assistantName değerini VoiceControl sınıfına iletmek için başlatma listesini kullan
// - powerOn() metodu: "<deviceName> powering on..." yazdırır, ardından connect() ve listen() çağırır
// - showAllStatus() metodu: "<deviceName> Status:" yazdırır, ardından her iki status() metodunu çağırır
//   kapsam çözümleme işlecini kullanarak (WiFiDevice::status() ve VoiceControl::status())

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

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

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

    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