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ş:
Neden varsayılan parametresiz yapıcı p...
Neden bu varsayılan yapıcı değil mi?...
Neden C# varsayılan olarak sanal olmay...
Neden git ileri varsayılan olarak birl...
Neden modern Perl varsayılan olarak UT...