2016-03-21 22 views
11

Bu kodda b1 çalışmalarına atama yapılır, ancak b2'ye (statik dökümle birlikte veya yokken) atanmaya izin verilmez. Aslında karşı problemi, kamu mirasını çözmeye çalışıyordum ama örtülü olarak üsse dönmüyordu. Ancak cast operatörü asla kullanılmıyor gibi görünüyor. Bu neden? [class.conv.fct] kaynaktanNeden cast operatörünün özel bir tabana kullanılmıyor?

struct B {};  

struct D1 : private B { 
    operator B&() {return *this;} 
    B& getB() {return *this;} 
}; 

struct D2 : public B { 
    explicit operator B&() {return *this;} 
}; 

struct D3 : public B { 
    operator B&() = delete; 
}; 

void funB(B& b){} 

int main() { 
    D1 d1; 
    funB(d1.getB()); // works 
    // funB(d1); // fails to compile with 'inaccessible base class 
    D2 d2; 
    funB(d2); // works 
    D3 d3; 
    funB(d3); // works 
    return 0; 
} 
+0

Tanımladığınız derleme hatasını çoğaltamıyorum. – Peter

+0

@Peter: Çoğaltılmış [burada] (http://ideone.com/hKSEAo) –

+0

@Barabas: Cevabı vermek için standarttan uygun bir alıntıyla birini bekleyeceğim, ancak kamu mirasını "... Bir "ve özel bir miras olarak" var-bir ". Yani, “D2” ve “D3”, “B” nin özel örnekleridir, oysa “D1”, * B * olan bir şeydir. –

cevap

11

: Bir dönüştürme işlevi (muhtemelen ev nitelikli) nesneyi (muhtemelen ev nitelikli) aynı nesne türüne (ya da bir referans dönüştürmek için kullanılan hiçbir zaman

, bu türden bir (muhtemelen cv-kalifiye) temel sınıfına (veya buna bir referansa) veya (muhtemelen cv-kalifiye) geçersizdir. İlk örnekte

Yani: Bir temel sınıf dönüşür çünkü

struct D1 : private B { 
    operator B&() {return *this;} 
    B& getB() {return *this;} 
}; 

operator B& asla kullanılmayacaktır. Özel bir temel sınıf olması önemli değil.

+0

Yani eğer doğru anlıyorsam, açık bir dönüşüme sahip olmakla birlikte miras almamak imkansızdır, değil mi? – Barabas

+0

@Barabas Ne soruyorsun emin değilim. – Barry

+0

Ya halka açık bir şekilde miras kalıyorsunuz ve sınıfınız örtülü olarak temeline dönüştürülecek ya da özel olarak (veya korumalı) miras alırsınız ve static_cast/constructor ile bile hiç dönüşüm yapmayacaktır. Etrafında hiç bir yol yok, değil mi? – Barabas

İlgili konular