SORU
28 Mart 2012, ÇARŞAMBA


Neden Varsayılan yapıcı sanal miras denir?

Türünde bir nesne ben instanciate zaman aşağıdaki kodu, daughter, grandmother() varsayılan yapıcı adlı anlamıyorum, neden ?

Ya grandmother(int) kurucu adı olması gerektiğini düşündüm (mother sınıf benim kurucu belirtimi için), ya da bu kod derlemek gerekmez mi sanal miras yüzünden.

Burada derleyici sessizce hiç istemedim oysa benim arkada grandmother varsayılan yapıcıyı çağırır.

#include <iostream>

class grandmother {
public:
    grandmother() {
        std::cout << "grandmother (default)" << std::endl;
    }
    grandmother(int attr) {
        std::cout << "grandmother: " << attr << std::endl;
    }
};

class mother: virtual public grandmother {
public:
    mother(int attr) : grandmother(attr) {
        std::cout << "mother: " << attr << std::endl;
    }
};

class daughter: virtual public mother {
public:
    daughter(int attr) : mother(attr) {
        std::cout << "daughter: " << attr << std::endl;
    }
};

int main() {
  daughter x(0);
}

CEVAP
28 Mart 2012, ÇARŞAMBA


Sanal inheritence kullanırken, sanal taban sınıfın kurucu doğrudan çoğu türetilmiş sınıf yapıcı tarafından çağrılır. Bu durumda, daughter yapıcı doğrudan grandmother kurucusunu çağırır.

Açıkça grandmother başlatma listesinde yapıcı aramadın beri, varsayılan yapıcı çağrılır. Doğru kurucusunu çağırmak için, değiştirmek için:

daugther(int attr) : grandmother(attr), mother(attr) { ... }

Ayrıca This FAQ entry bkz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dan Gately

    Dan Gately

    13 AĞUSTOS 2006
  • Helder Barreto

    Helder Barre

    22 Mayıs 2006
  • Pepsi

    Pepsi

    1 Kasım 2005