Sınıfımın korumalı yöntemlerini ve yapıcılarını sınamaya çalışıyorum. Bu amaçla, ben alt sınıf ve C++ 11 using
anahtar kelime ile kamuoyuna olarak üyelerini yeniden ihraç etmeye çalıştı: AncakDevralınan yapıcıyı genel yapmak için 'using' anahtar sözcüğünün kullanımı
class Foo {
protected:
Foo(int i) {}
void run() {}
};
class TestableFoo : public Foo {
public:
using Foo::Foo;
using Foo::run;
};
int main() {
TestableFoo foo(7);
foo.run();
}
, hem g ++, clang ++ aşağıdaki hatayı üreten, bunu derlemek için başarısız:
test.cpp:13:15: error: ‘TestableFoo::TestableFoo(int)’ is protected
using Foo::Foo;
^
test.cpp:18:16: error: within this context
TestableFoo foo(7);
^
TestableFoo kurucusu hala run
yöntemi herkese açık olsa bile korunur (ayrıca onayladım). Neden böyle? Ya kararları anlayabiliyordum (görünürlük üzerine yazabilme vs.), fakat neden yöntemler ve kurucular arasında bir tutarsızlık var?
Related'i - http://stackoverflow.com/questions/24014240/c11-declaring-factory-a-friend-of-base-class - ama neden cevap vermiyor * neden * – Praetorian
"Neden", muhtemelen, aksi takdirde, bu durumda miras kalmamanın verimsizliğinden daha kötü bir kötülük olarak düşünülebilecek olan yapıcıların * bütününün erişilebilirliğini değiştireceğinden muhtemelen muhtemeldir. Ama bu sadece bir tahmin. –