sanal atama operatörü C | Netgez.com
SORU
21 Mart 2009, CUMARTESÄ°


sanal atama operatörü C

C atama Operatörü sanal yapılabilir. Neden gereklidir? Diğer operatörlerin sanal yapabilir miyiz?

CEVAP
21 Mart 2009, CUMARTESÄ°


Atama operatörü sanal yapılmış olması gerekli değildir.

Aşağıdaki tartışma operator= ama bu da bir soru tipi ve soru türünü kabul eden herhangi bir işlevi kabul eden herhangi bir operatör yükleme için geçerlidir.

Tartışma aşağıda sanal bir anahtar sözcük parametrenin miras eşleşen işlevi bir imza bulma konusunda haberi olmadığını gösterir. Son örnekte miras türleri ile ilgili düzgün atama işlemek için nasıl gösterir.


Sanal fonksiyonlar parametre mirasını bilmem:

Bir stack sanal oyun haline gelmek için aynı olması gerekiyor. Aşağıdaki örnek, operatör= sanal yapılır bilmiyorum bile. Çağrı asla parametreleri ve dönüş operatörü= değer farklı olduğu için D sanal bir fonksiyonu olarak hareket edecek.

Fonksiyonu B::operator=(const B& right) D::operator=(const D& right) 100% tamamen farklı ve görülen 2 ayrı işlevleri vardır.

class B
{
public:
  virtual B& operator=(const B& right)
  {
    x = right.x;
    return *this;
  }

  int x;

};

class D : public B
{
public:
  virtual D& operator=(const D& right)
  {
    x = right.x;
    y = right.y;
    return *this;
  }
  int y;
};

Ve 2 aşırı yüklenmiş varsayılan değerlere sahip operatörler:

Ancak tanımladığınız bir sanal çalışmasına izin vermek için varsayılan değerleri ayarlamak için D zaman atanan değişkenin türü B. Bu bile senin B değişken gerçekten bir D saklı bir referans B. olmaz olsun D::operator=(const D& right) işlevi.

Aşağıda bu durumda, 2 D nesneleri 2 B başvuruları... D::operator=(const B& right) geçersiz kılma içinde saklı bir ödev kullanılır.

//Use same B as above

class D : public B
{
public:
  virtual D& operator=(const D& right)
  {
    x = right.x;
    y = right.y;
    return *this;
  }


  virtual B& operator=(const B& right)
  {
    x = right.x;
    y = 13;//Default value
    return *this;
  }

  int y;
};


int main(int argc, char **argv) 
{
  D d1;
  B &b1 = d1;
  d1.x = 99;
  d1.y = 100;
  printf("d1.x d1.y %i %i\n", d1.x, d1.y);

  D d2;
  B &b2 = d2;
  b2 = b1;
  printf("d2.x d2.y %i %i\n", d2.x, d2.y);
  return 0;
}

Baskı:

d1.x d1.y 99 100
d2.x d2.y 99 13

D::operator=(const D& right) hiç kullanılmamış olduğunu gösterir.

B::operator=(const B& right) virtual anahtar sözcüğü olmadan aynı sonuçları yukarıdaki gibi olurdu ama y değerini başlatıldı olmaz. I. e. B::operator=(const B& right) kullanın


Hepsini bir araya bağlamak için son bir adım, RTTI:

RTTI düzgün bir şekilde yazın alacağını sanal fonksiyonları işlemek için kullanabilirsiniz. Burada muhtemelen kalıtsal türleri ile ilgili düzgün atama işlemek için nasıl anlamaya bulmacanın son parçası.

virtual B& operator=(const B& right)
{
  const D *pD = dynamic_cast<const D*>(&right);
  if(pD)
  {
    x = pD->x;
    y = pD->y;
  }
  else
  {
    x = right.x;
    y = 13;//default value
  }

  return *this;
}

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • CorridorDigital

    CorridorDigi

    17 Mayıs 2010
  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • FUNKER530 - Veteran Community & Combat Footage

    FUNKER530 -

    25 Ocak 2007