sanal atama operatörü C
C atama Operatörü sanal yapılabilir. Neden gereklidir? Diğer operatörlerin sanal yapabilir miyiz?
CEVAP
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;
}
Atama operatörü taşıma ve `bu ( = ! ve...
Nasıl C'un temel sınıf kurucuları...
Varsayılan otomatik oluşturulması için...
Operatörü (== vs ===) eşittir konuda b...
= Operatörü Java...