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!
本文探讨了C++中虚函数在派生类中被声明为私有时的行为,并解释了为何通过基类指针调用该函数可以成功的原因。通过深入分析C++对象模型,揭示了编译时和运行时的访问检查机制。

A()
5921

被折叠的 条评论
为什么被折叠?



