SORU
6 Mart 2010, CUMARTESİ


Neden C Sanal Yöntemler ihtiyacımız var mı ?

C öğreniyorum ve sadece Sanal İşlevleri/Yöntemleri içine alıyorum.

Okuduğum kadarıyla (kitap ve online), Sanal Yöntem türetilmiş sınıfları geçersiz bir temel sınıf içinde yöntemleri vardır.

Ama kitabın önceki bölümlerinde, temel miras hakkında öğrenme zaman, virtual kullanmadan türetilmiş sınıflar temel yöntemleri geçersiz kılmak mümkün oldu.

Burada neyi kaçırıyorum? Sanal bir yöntem daha var ve tam olarak ne olduğu konusunda net olmak istiyorum çok önemli gibi görünüyor biliyorum. Ben sadece doğru düzgün bir cevap online bulamıyor.

CEVAP
6 Mart 2010, CUMARTESİ


C acemi sayılırım, ama sanal işlevleri nelerdir sadece anladım, ama gerekli onlar neden burada:

Hadi bu iki sınıf olduğunu varsayalım:

class Animal
{
public:
void eat() { std::cout << "I'm eating generic food."; }
}

class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
}

Ana fonksiyon:

Animal *animal = new Animal;
Cat *cat = new Cat;

animal->eat(); // outputs: "I'm eating generic food."
cat->eat();    // outputs: "I'm eating a rat."

Şimdiye kadar çok iyi değil mi? Hayvanlar genel gıda, tüm kedi virtual olmadan fareler yiyin.

Hadi eat() Ara fonksiyonu (sadece bu örnek için önemsiz bir fonksiyon) denir ki Şimdi biraz değişiklik:

//this can go at the top of the main.cpp file
void func(Animal *xyz) { xyz->eat(); }

Şimdi bizim ana işlevi vardır:

Animal *animal = new Animal;
Cat *cat = new Cat;

func(animal); // outputs: "I'm eating generic food."
func(cat);    // outputs: "I'm eating generic food."

Ah ah... func(), içine bir Kedi geçtik ama fareleri yemiyor. Kedi *alır,* 14* aşırı yük gerekir ? Eğer Hayvandan daha hayvanlar elde etmek varsa func() kendi gerekir.

Çözüm eat() sanal bir işlevi yapmak için

class Animal
{
public:
virtual void eat() { std::cout << "I'm eating generic food."; }
}

Ana:

func(animal); // outputs: "I'm eating generic food."
func(cat);    // outputs: "I'm eating a rat."

Bitti.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Djbasilio AuToBaSs

    Djbasilio Au

    20 Aralık 2008
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • tunez4you

    tunez4you

    20 EKİM 2008