linux&c++ R&D

programing is a pleasure!

Permission problem on a derived private method from public method

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!


posted on 2007-04-21 12:44 丑石 阅读(679) 评论(0)  编辑 收藏 引用 所属分类: C++ problem and solution


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

News

常用链接

留言簿(1)

随笔分类(13)

随笔档案(17)

文章档案(1)

相册

收藏夹(1)

Friends' blog

useful sites

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜