Video: C++ Ders3: Fonksiyonlar (2/2) (Ortogon) 2024
Belli bir işlev çağrısının geç olduğunu düşünüyorsanız, bunun olduğu anlamına gelmez. Alt sınıflarda aynı argümanlarla bildirilmediyse, üye işlevler, sanal olarak bildirilmiş olsun olmasın, polimorfik olarak geçersiz kılınmaz.
Aynı bildirim kuralı için bir istisna, taban sınıfındaki üye işlev bir işaretçi veya bir temel sınıf nesnesine referans döndürürse, bir alt sınıfdaki bir geçersiz kılınan üye işlev, bir alt sınıfın bir nesnesine bir işaretçi veya referans döndürebilir. Diğer bir deyişle, iki işlevin dönüş türü farklı olmasına rağmen, makeACopy () işlevi polimorfiktir:
class Base {public: // geçerli nesnenin bir kopyasını döndürür Base * makeACopy ();}; class SubClass: public Base {public: // geçerli nesnenin bir kopyasını döndür SubClass * makeACopy ();}; void fn (Taban & bc) {Taban * pCopy = bc. Bir kopyasını çıkarmak(); // devam edin …}
Pratikte, bu oldukça doğal. Bir makeACopy () işlevi, BaseClass:: makeACopy () öğesini geçersiz kılabilse bile, bir SubClass , nesnesi döndürmelidir.
Bu iş sessizce ne zaman bir işlevi geçersiz kılar ve C ++ hata kaynağı değilse; öyle ki 2011 standardı, programcının bir temel sınıf işlevini geçersiz kılmak amacını belirtmek için kullanabileceği tanımlayıcı geçersiz kıl 'ı tanıttı.
C ++, bir işlev geçersiz kılma bildirildi, ancak aslında aşağıdaki örnekte olduğu gibi bir temel sınıf işlevini (örn. Eşleşmeyen bir bağımsız değişken gibi) geçersiz kılarsa bir derleyici hatası üretir: >
Bu parçacık derleme zamanı hatası üretir çünkü GradStudent:: addCourseGrade (float) yöntemi geçersiz kılma olarak bildirilmiştir ancak temel sınıf işlevini Student:: addCourseGrade (double) ile geçersiz kılmaz; çünkü argüman türleri don ' maç.
son anahtar sözcüğünü kullanarak geçersiz kılınamayan bir işlev de ilan edebilir; bu işlev, aşağıdaki ek 'da gösterildiği gibi, bazı önceki temel sınıf işlevini geçersiz kılar bile > PostDoc sınıfı: sınıfı GradStudent: public Öğrenci {public: void addCourseGrade (double grade) final;}; sınıf PostDoc: public GradStudent {public: sanal void addCourseGrade (çift sınıf);}; Öğrenci:: addCourseGrade (),
Öğrenci
yöntemini geçersiz kılmaya çalıştığı için PostDoc:: addCourseGrade () bildirimi bir hata üretir; final , olarak işaretlendiğinden.
sınıf GradStudent final: public Öğrenci Bu sadece sınıfın sanal yöntemlerinden daha fazlasını etkiler.
finali
sınıfı hiç miras alınamaz.