SORU
22 AĞUSTOS 2008, Cuma


C , sanal bir temel sınıf nedir?

Bir şeyi bilmek istiyorum "sanal temel sınıf" ve bu anlama gelir.

Bana bir örnek vereyim:

class Foo
{
public:
    void DoSomething() { /* ... */ }
};

class Bar : public virtual Foo
{
public:
    void DoSpecific() { /* ... */ }
};

CEVAP
22 AĞUSTOS 2008, Cuma


Sanal temel sınıflar, sanal miras olarak kullanılan, "" belirli bir sınıfın birden çok devralma kullanırken bir devralma hiyerarşisinde görünen örneklerinin birden fazla önlemenin bir yoludur

Aşağıdaki senaryoyu düşünün:

class A { public: void Foo() {} };
class B : public A {};
class C : public A {};
class D : public B, public C {};

Yukarıda sınıf hiyerarşisi sonuçları "korkunç elmas" olan bu gibi görünüyor:

  A
 / \
B   C
 \ /
  D

D bir iki örnek var ve bu Yüzden de A. içeren Bir içeren B ve C olacak "örnekleri" daha iyi bir ifade İçİn () A

Bu senaryo, belirsizlik ihtimali var. Bunu yaptığınızda ne olur:

D d;
d.Foo(); // is this B's Foo() or C's Foo() ??

Sanal miras bu sorunu çözmek için vardır. Sizin sınıfları devralmasını sanal belirtirken, sadece tek bir örnek istiyorum derleyici söylüyorsun.

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

Bu "" Bir hiyerarşiye dahil. örnek sadece bir tane var anlamına gelir Dolayısıyla

D d;
d.Foo(); // no longer ambiguous

Yardımcı olan mini bir özeti gibi umut. Daha fazla bilgi için this this bir okuma var. İyi bir örnek de 14 ** mevcuttur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boburnham

    boburnham

    11 Temmuz 2006
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007
  • WK

    WK

    9 Ocak 2006