Come molti hanno sottolineato, è legale.
Tuttavia, la parte "IS-A" non è così semplice. Quando si parla di "polimorfismo dinamico", la relazione "IS-A" vale, io. tutto ciò che puoi fare con Super puoi farlo anche con l'istanza derivata.
Tuttavia, in C++ abbiamo anche qualcosa che viene spesso definito come polimorfismo statico (modelli, il più delle volte). Si consideri il seguente esempio:
class A {
public:
virtual int m() {
return 1;
}
};
class B : public A {
private:
virtual int m() {
return 2;
}
};
template<typename T>
int fun(T* obj) {
return obj->m();
}
Ora, quando si tenta di utilizzare "il polimorfismo dinamico" tutto sembra essere ok:
A* a = new A();
B* b = new B();
// dynamic polymorphism
std::cout << a->m(); // ok
std::cout << dynamic_cast<A*>(b)->m(); // ok - B instance conforms A interface
// std::cout << b->m(); fails to compile due to overriden visibility - expected since technically does not violate IS-A relationship
...ma quando si utilizza "il polimorfismo statico" si può dire che "is-a" relazione non regge più:
A* a = new A();
B* b = new B();
// static polymorphism
std::cout << fun(a); // ok
//std::cout << fun(b); // fails to compile - B instance does not conform A interface at compile time
Così, alla fine, cambiando la visibilità per il metodo è "piuttosto legale", ma questo è uno dei più brutti cose in C++ che possono portare a trabocchetti.
fonte
2013-05-21 12:04:14
grazie controllare il riferimento che hai indicato. Grazie. – irappa
Non credo che si rompa * è-a * ma senza comprare il libro non saprei. Scott Meyers potrebbe essere [uno dei 5 più importanti C++, secondo alcuni] (http://www.artima.com/cppsource/top_cpp_people.html), ma ha una scarsa presenza on-line. –