Kodlamayı (bazı yardımlarla) dün sona erdirdim:Bir üyenin erişim seviyesini değiştirmek nasıl ve neden mümkündür?
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo(){cout << "A::foo\n";}
};
class B : private A
{
private:
virtual void foo(){ cout << "B::foo\n";}
void DoSomething(SomeOtherClass& o){o.DoSomething(*static_cast<A*>(this));}
};
Miras yöntemini değiştirmeyi denedim:
class B : public A
{
private:
virtual void foo(){ cout << "B::foo\n";}
};
int main()
{
A* a = new B;
a->foo();
}
Bu hala çalışıyor. Derleme zamanı hatası bekleniyor. Lütfen bunun neden mümkün olduğunu ve olası kullanımların neler olduğunu söyle? İlk senaryo nedeniyle bir kullanım biliyorum - Farklı sınıflar için farklı arayüzler ortaya çıkarabilir.
DÜZENLEME:
İkinci durumda çıktı B::foo
.
Hatayı nereden buldunuz?İşlevin özel olarak bildirilmesi üzerine mi? Ya da işlevin çağrılması üzerine? –
Şaşırdım. Bu özelliğin olası kullanımlarını açıklayabilecek bir cevabı umuyoruz (?). Bir kullanım, programcıyı, arabirimini kullanmak için B sınıfının bir işaretçisi olarak B sınıfını başlatması için zorlamak olabilir. Ama neden bu iyi bir şey olurdu, bilmiyorum. – manneorama
@PigBen: İkinci durumda, 'B' içindeki foo'nun tanımındaki hatayı bekledim. – nakiya