Davut KARA

Bilişim Sistemleri Mühendisi

Bu blog, 5 yıl önce, bilişim ve diğer konularda hakkında, makalelerime yer vermek amacı ile açılmıştır.

Compe 225 | C++ Ders 16 Data/method hiding and redefinition

C++ BannerBu konu aslında global olarak veya bir üst scope da tanımlanmış bir değişkenin ve fonksiyonu tekrar tanımlayarak, her iki değerinede ulaşma yöntemidir. Yani diyelimki global bir değişken tanımladınız bu değişkene main içinde erişebilirsiniz aynı zamanda main içinde aynı isimde bir değişken tanımladınız, normal şekilde kullanıdığınızda değişken en yakında tanımlandığı değeri alacaktır ama siz bu yöntemle hem global deki değeri hemde son değere erişebiliyorsunuz.

Basit bir örnekle açıklayacak olursak.

#include <iostream>
using namespace std;
// Global değişkenler
int gA = 1;
int gB = 2;
int main(){
int gA = 4; // Global değişkenle aynı adı kullanarak tekrar bir tanımlama yapıyoruz.
cout << gA << endl; // En yakında ki değeri verir
cout << gB << endl; // Global değişken
// Başına 4nokta (fordot) koyarak aynı şekilde global değişkenede erişebildik.
cout << ::gA << endl;
}

Yani özetle: Bir değişkenin başına :: (4dot-4nokta) koyarak global değişken olduğunu belirtiyoruz, bu sayede global değişkenin adını tekrar kullansak bile, 4dot sayesinde hem global e hemde tanımlı olduğu scope değerini alabiliyoruz.

Bu durumda her değişken ve fonksiyonu farklı farklı scope larda aynı isimlerde tanımlayabiliriz, bunu zaten biliyorduk, burda öğrendiğimiz şey bir üst scope daki tanıma nasıl erişebiliyoruz. Bunu 4 dot yöntemi ile yapıyoruz bu kadar.

Aynı şeyi class lardada yapabiliyoruz, bir adet parent (base) bir adet child(derived) class olduğunu düşünelim her ikisindede aynı isimde bir fonksiyon tanımladık, parent daki fonksiyonu parent kullanır childdaki fonksiyonu child kullanır, buraya kadar da tamam.

Peki ya child parent ın alt classı olduğu için parent ın fonksiyonunu kullanabilir mi ? Cevap evet kullanabilir. Bunuda yine aynı şekilde 4dot ile yapıyoruz, ancak bu kez 4dot ın başına parent class ın adını yazıyoruz.

#include <iostream>
using namespace std;
// Global en dışdaki fonksiyon.
int calcSq(int a){
	return a*a;
};

class A1 {
	public:
	int gA;
	int calcSq(int a){ // A1 class ının fonksiyon tanımı
		return a*a;
	}
	void setA(int a){
		gA = calcSq(a); // A1 classının
	}
};

class A2 : public A1 {
    public:
	int calcSq(int a){ // A2 class ının fonksiyon tanımı
		return a*a;
	}
	void setA(int a){
	gA = calcSq(a); // A2 classının
	gA = A1::calcSq(a); // İŞTE BU <<- Bu sayede A2 içinde A1 fonksiyonunu kullandık.
	}
};
int main(){
A2 a;
cout << a.calcSq(4) << endl; // Tabiki A2 classının
}

 

 

Zor görünsede aslında bilmeniz gereken tek şey 4dot başka bir şey yok.