problem:
Is there a good explanation why compilation tags error for the call to
AA.method(). It is public in the base class. If cast to baseclass,
then compiler says it's ok.
class A {
public:
A() {}
virtual ~A() {}
virtual void method(void) { std::cout << "A::method" <<std::endl; }
};// A
class AA : public A {
public:
AA() {}
virtual ~AA() {}
private:
virtual void method(void) {
A::method();
std::cout << "AA::method" << std::endl;
}
};// A
int main()
{
AA obj;
A* p = &obj;
p->method();
//((A&)obj).method();
obj.method(); // ERROR:
}
gcc -o drvd drvd.cpp -lstdc++ -lm
drvd.cpp: In function `int main()':
drvd.cpp:26: error: `virtual void AA::method()' is private
drvd.cpp:46: error: within this context
http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/7ae23191ff4de6a9/4560e82948e9b91e#4560e82948e9b91e
solution:
Above ,it seems as if it is a paradox !
why in devived class,function method() is declared as a private memeber,still in the way
A
* p = &obj;
p->method();
it is right!
The phenomena is explained in the Inside the C++ object model!
In fact,p->method() is checked in two phases!
At complie time,p->method()
According to p type,check method()'s access level and method()'s validity,such as membership!
so p->method() is right!
At run time,
p->method() is called in
polymorphism way according to p's RTTI information!
extending:
Although it looks strange,maybe we can employ it!
for example:
class A{
public:
virtual void method()=0;
}
class AA:public A{
private:
virtual void method(){
...
}
};
Obviously,
A is interface and AA is a implemention!
In the way,if you use AA directly,
it will result in error,so prevent any subclass's use!
A is the only entry!
It may be helpful in some library's device!