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

  • Justin Davis

    Justin Davis

    14 Ocak 2008
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • trickycharms

    trickycharms

    6 Aralık 2013