Arkadaşlık neden en azından isteğe bağlı olarak C ++ 'da miras alınamaz? Geçişkenliğin ve dönüşlülüğün bariz nedenlerden dolayı yasaklandığını anlıyorum (bunu sadece basit SSS alıntı cevaplarından kaçınmak için söylüyorum), ancak virtual friend class Foo;
bulmacalar doğrultusunda bir şeylerin olmaması beni şaşırtıyor. Bu kararın arkasındaki tarihsel arka planı bilen var mı? Arkadaşlık gerçekten de, o zamandan beri birkaç belirsiz saygın kullanıma giren sınırlı bir hack miydi?
Açıklama Düzenleme: Ben aşağıdaki senaryoda, bahsediyorum değil A'nın çocukları ya B'ye veya B ve hem de çocuklar maruz kalmaktadır. Ayrıca isteğe bağlı olarak arkadaş işlevlerinin geçersiz kılmalarına vb. Erişim izni vermeyi de hayal edebiliyorum.
class A {
int x;
friend class B;
};
class B {
// OK as per friend declaration above.
void foo(A& a, int n) { a.x = n; }
};
class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };
Kabul cevap: olarak Loki devletler , etkisi dolayısıyla sıkı yoktur, az ya da çok friendede baz sınıflarında korumalı vekil fonksiyonları yaparak simüle edilebilir ihtiyacı bir sınıf veya sanal yöntem heirarchy için dostluk verilmesi. Standart vekillere duyulan ihtiyaçtan hoşlanmıyorum (ki bu dost taban etkili bir şekilde oluyor), ancak bunun çoğu zaman kötüye kullanılması daha muhtemel olan bir dil mekanizmasına göre tercih edildiğini düşünüyorum. Muhtemelen Stroupstrup'un The Design and Evolution of C ++ adlı kitabını satın alıp okumanın zamanı geldi , ki burada yeterince insan bu tür sorulara daha iyi bir bakış açısı kazandırmak için tavsiye etti ...