为什么这个程序可以正常运行并输出正确结果?

M_S_D_N 2009-02-28 07:13:02

#include <iostream>
using namespace std;

class A
{
public:
virtual void f(){ cout << "I am an object of A." << endl; }
};

class B : public A
{
private:
virtual void f(){ cout << "I am an object of B." << endl; }
};

void main()
{
A* p = new B();
p->f();
}
...全文
135 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Laozql 2009-03-01
  • 打赏
  • 举报
回复
经测试virtual同样受到私有共有的约束,8楼给个解释
Laozql 2009-03-01
  • 打赏
  • 举报
回复
奇怪了,知道p绑定了B,但为什么可以调用私有成员啊?
  • 打赏
  • 举报
回复


class A
{
public:
void f(){ cout << "I am an object of A." << endl; }
};

class B : public A
{
private:
void f(){ cout << "I am an object of B." << endl; }
};

void main()
{
A* p = new B();
B b;
cout << typeid(p).name() << endl;
p->f();
b.f();
}

改成这样就可以很好地测试楼主的疑问了。
  • 打赏
  • 举报
回复

class A
{
public:
virtual void f(){ cout << "I am an object of A." << endl; }
};

class B : public A
{
private:
virtual void f(){ cout << "I am an object of B." << endl; }
};

void main()
{
A* p = new B();
cout << typeid(p).name() << endl;
p->f();
}


楼主想的很仔细啊。
p的有效范围截至基类A,而f是虚函数,动态调用,依然是子类里的。至于private的限制只对静态数据才有效吧,virtual不受此限制吧。
  • 打赏
  • 举报
回复
子类指针指向父类,并且调用的函数在子类中是没有错误的。
并且你的f()是虚函数。根据虚函数表
p->f(); 执行的是b的f();
A* p = new B(); 此处p是A类型的指针,但是实际上的内容是b类型。

使用虚函数重写
符合多态的定义
运行时就会动态调用子类的函数实现
fang123424878 2009-03-01
  • 打赏
  • 举报
回复
弱弱地问一句:A* p = new B(); 这句是什么意思
M_S_D_N 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 M_S_D_N 的帖子:]

#include <iostream>
using namespace std;

class A
{
public:
virtual void f(){ cout < < "I am an object of A." < < endl; }
};

class B : public A
{
private:
virtual void f(){ cout < < "I am an object of B." < < endl; }
};

void main()
{
A* p = new B();
p->f();

[/Quote]

大家看清楚黑体的地方!
xianyuxiaoqiang 2009-02-28
  • 打赏
  • 举报
回复
Of course it does.
jakqigle 2009-02-28
  • 打赏
  • 举报
回复

虚函数表是实现多态的技术。可以看看《thinking in c++》或者其他一些c++关于多态的书。
详细的解释不便说。
简单理解为c++实现多态的时候有一个隐含的机制可以调用指针或引用所指的具体对象的类成员函数,而并不一定是开始定义的指针的类型的类的成员函数
bitxinhai 2009-02-28
  • 打赏
  • 举报
回复
子类指针指向父类,并且调用的函数在子类中
使用虚函数重写
符合多态的定义
运行时就会动态调用子类的函数实现
hemiya 2009-02-28
  • 打赏
  • 举报
回复
把子类的指针赋值给父类的指针语法上是没有错误的。
并且你的f()是虚函数。根据虚函数表
p->f(); 执行的是b的f();
A* p = new B(); 此处p是A类型的指针,但是实际上的内容是b类型。

65,198

社区成员

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

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