Sobes.tech
Senior

Təmiz virtual metod necə çağırılır?

sobes.tech Süni İntellekt

AI-dan cavab

Təmiz virtual metodu birbaşa baz sinifinə işarəçi vasitəsilə və ya bu sinifin obyekti vasitəsilə çağırmaq mümkün deyil, çünki onun baz sinifində tərifi yoxdur.

Ancaq, təmiz virtual metod törəmə sinifin konstruktoru və ya destruktorundan çağırıla bilər; bu zaman çağırış statik rejimdə həll olunur və çağırışın həyata keçirildiyi sinifin tətbiqi çağırılır.

Törəmə sinifin konstruktorundan çağırış nümunəsi:

#include <iostream>

class Base {
public:
    virtual void pure_virtual_method() = 0; // Təmiz virtual metod
};

class Derived : public Base {
public:
    void pure_virtual_method() override {
        std::cout << "Derivedda tətbiq\n";
    }

    Derived() {
        // Törəmə sinifin konstruktorundan təmiz virtual metodun çağırılması
        pure_virtual_method();
    }
};

int main() {
    Derived ob; // Törəmə sinifin obyekti yaradılır, konstruktor çağırılır
    return 0;
}

Bu nümunədə, Derived sinifinin obyekti ob yaradıldıqda, Derived konstruktoru çağırılır və burada pure_virtual_method() çağırılır. Deriveddə bu metodun tətbiqi mövcuddur, ona görə uğurla çağırılır.

Abstrakt baz sinifin konstruktoru və ya destruktorundan təmiz virtual metod çağırmaq, bu metodun elan olunduğu halda, qeyri-müəyyən davranışa səbəb olar; çünki baz sinifin konstruktoru və ya destruktoru icra edilərkən, vtable hələ tam qurulmamış və ya artıq məhv olmuş ola bilər və müvafiq tətbiq törəmə sinifdə mövcud deyil.

Həmçinin, Base::pure_virtual_method() kimi sahə sahəsini istifadə edərək çağırmaq mümkündür, lakin bu yalnız törəmə sinifdə təmiz virtual metodun tətbiqi zamanı, əgər o, baz sinifindən tətbiqi çağırırsa (bu, təmiz virtual metodlar üçün mümkün deyil) və ya başqa bir funksiya vasitəsilə təmiz virtual metod çağırılırsa (bu da qeyri-müəyyən davranışa səbəb olar), və ya baz sinifində eyni adlı non-virtual metodu çağırmaq üçün.

Təmiz virtual metod ilə təqdim olunan məntiq ilə işləmək üçün düzgün yol, törəmə sinifin obyektini yaratmaq və bu məntiqi baz sinifinə işarəçi və ya referens vasitəsilə çağırmaqdır (polimorfizm).

#include <iostream>

class Base {
public:
    virtual void pure_virtual_method() = 0;
};

class Derived : public Base {
public:
    void pure_virtual_method() override {
        std::cout << "Polimorfizm vasitəsilə Derivedda tətbiq\n";
    }
};

int main() {
    Base* ptr = new Derived(); // Polimorfik çağırış
    ptr->pure_virtual_method();
    delete ptr;
    return 0;
}

Beləliklə, "təmiz virtual metodu çağırmaq" ümumi mənada (obyekt və ya baz sinifinə işarəçi vasitəsilə, tərifi olmayan) mümkün deyil. Çağırış yalnız törəmə sinifin konstruktoru və ya destruktorundan onun tətbiqi ilə və ya polimorfizm vasitəsilə, törəmə sinif obyekti yaradılarkən həyata keçirilə bilər.