访问控制符疑问

tianya0609 2010-03-28 10:18:12

#include <iostream>
using namespace std;

class A
{
public :
virtual void Print()
{
cout << "A" << endl;
}
};

class B : public A
{
virtual void Print()
{
cout << "B" << endl;
}
};

int main(int argc, char *argv[])
{
A* obj = new B();
obj->Print();
return 0;
}




虚拟函数根据动态类型会调用类B的Print函数,为什么不会因为私有而出问题呢?谁有相关的文章或者资料提供下,谢也!
...全文
82 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ameyume 2010-03-28
  • 打赏
  • 举报
回复
C++中的虚函数
http://www.vckbase.com/document/viewdoc/?id=950


C++虚函数和多态学习笔记
http://dev.csdn.net/author/bodybo/9284c0eb1a5b4ae4b68e86cd7668c429.html
晨星 2010-03-28
  • 打赏
  • 举报
回复
这可以看成动态多态的功能之一啊。实现一种功能,但仅可通过父类接口使用,不可通过本类接口使用。
obj是A类型的指针,于是根据其静态类型,它可以调用所有A类公开出来的成员函数。至于虚函数的情况最终到底绑定到哪家,那完全是运行时的事情,编译器管不着。
静态类型只管语法检查,而虚拟多态只管动态绑定,这两个东西是完全正交的,并不会糅合在一块起作用,而且起作用的时机都不一样。
另外别忘了,C++语言中,类的访问控制机制只在源代码级别上起作用。它是帮助开发者澄清自己的设计,同时协助不同开发者之间的有效沟通。它与物理意义上的“代码安全控制”毫无关系。

以前写过一篇博客,所分析的情况跟你的情况不完全一样,但也有相通之外,如果有兴趣可以看看:
http://blog.csdn.net/steedhorse/archive/2005/03/29/333664.aspx
yuzl32 2010-03-28
  • 打赏
  • 举报
回复
反汇编一下就清楚,这里简单示例。

A、B类
---------------------------
vtable [0]
[1]
[...]

A* obj = new B();
obj->Print(); //相当于obj->vtable[0]();在编译阶段已经用B中的printf地址填充给[0]。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧