SORU
4 Mayıs 2015, PAZARTESİ


Neden'-bildirim kullanarak t elmas sorunu çözmeye çalışmıyor?

Aşağıdaki kodu göz önünde bulundurun:

struct A
{
    void f()
    {
    }
};

struct B1 : A
{
};

struct B2 : A
{
};

struct C : B1, B2
{
    void f() // works
    {
        B1::f();
    }
    //using B1::f; // does not work
    //using B1::A::f; // does not work as well
};

int main()
{
    C c;
    c.f();

    return 0;
}

Ben size lütfen elmas sorunu çözmek için nasıl bir standart cevap kopyala yapıştır için rica ("sanal miras") kullanın. Burada ne sorduysam bildirimi kullanarak bu durumda bir işe yaramıyor neden olur. Tam derleyici hata:

In function 'int main()':
prog.cpp:31:6: error: 'A' is an ambiguous base of 'C'
  c.f();

A-bildirimi kullanarak bu örnek çalışmanız gerektiğini izlenim aldım:

struct A
{
    void f()
    {
    }
};

struct B
{
    void f()
    {
    }
};

struct C : A, B
{
    using A::f;
};

int main()
{
    C c;
    c.f(); // will call A::f

    return 0;
}

CEVAP
4 Mayıs 2015, PAZARTESİ


Başka biri standart teklif bulabilirsiniz, ama kavramsal olarak açıklamak için gidiyorum.

Çünkü bir işe yaramıyorkullanma bildirimisadece etkiler adı arama.

Seninkullanma bildirimineden başarılı olmak için Ad arama aksi halde başarısız olur nerde derleyici söylerişlevi f nerede bulabilirim.Ama bunu söylemezA sınıfın f birlikte iş görürbu bir f çağrıldığında this örtülü parametre olarak kabul edilecek.

A C subobjects ve türü A* this örtülü bir argüman alır iki olmasına rağmen 11* *tek bir işlevi var. Aramak için C, C* bir nesne üzerinde örtülü olarak A* dönüştürülmesi gerekir. Bu her zaman belirsiz ve herhangi biri tarafından etkilenmezkullanarak bildirimleri.

(Bu A iç veri üyeleri koyarsanız daha mantıklı. O zaman C Her bir veri üyesi iki olurdu. f denir, eğer eriştiği veri üyeleri, mu erişimi olanlar A sınıfın miras B1, ya da olanlar A sınıfın miras B2?)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • Louis C.K.

    Louis C.K.

    18 HAZİRAN 2006
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006