以下程序的输出结果是多少,为什么?

林初茵 2009-02-24 05:16:33
以下程序的输出结果是多少,为什么?
#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
public:
void f(void)
{
cout << "A::f" << endl;
}
virtual void g(void)
{
cout << "A::g" << endl;
}
};

class B: public A
{
public:
void f(void)
{
cout << "B::f" << endl;
}
void g(void)
{
cout << "B::g" << endl;
}
};

int main()
{
A* pA = new B;
pA->f();
pA->g();
B* pB = (B*)pA;
pB->f();
pB->g();
return 0;



}
...全文
125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
waizqfor 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinder22 的帖子:]
以下程序的输出结果是多少,为什么?
#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
public:
void f(void)
{
cout < < "A::f" < < endl;
}
virtual void g(void)
{
cout < < "A::g" < < endl;
}
};

class B: public A
{
public:
void f(void)
{

[/Quote]
LZ 你看看调用什么函数就可以了啊 类创建对象 直接调用构造函数 剩下就对着来吧

A* pA = new B;
pA->f();
pA->g();
B* pB = (B*)pA;
pB->f();
pB->g();
return 0;

输出
A::f
B::g
B::f
B::g

cxxer 2009-02-24
  • 打赏
  • 举报
回复
A::f
B::g
B::f
B::g

我大汗...
elmnd 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hqin6 的回复:]
我汗~~~这……

up一下
[/Quote]
同上
fairchild811 2009-02-24
  • 打赏
  • 举报
回复
传说中的派生类赋值给基类
太乙 2009-02-24
  • 打赏
  • 举报
回复
我汗~~~这……

up一下
dongpy 2009-02-24
  • 打赏
  • 举报
回复
A* pA = new B; //pA所指对象的vptr指向类B的虚函数表
pA->f(); //A::f,非虚函数,静态直接调用。
pA->g(); //B::g,虚函数,通过vptr间接调用。
B* pB = (B*)pA; //pB所指对象的vptr指向类B的虚函数表
pB->f(); //B::f,同上
pB->g(); //B::g,同上
passionboy03 2009-02-24
  • 打赏
  • 举报
回复
up,面试题经常遇到这样的……考察的虚函数功能,呵呵
[Quote=引用 1 楼 feng4206yu 的回复:]
C/C++ code
int main()
{
A* pA = new B;
pA->f(); //A::f 非虚函数,通过指针类型绑定
pA->g(); //B::g 虚函数,通过指针所实指类型动态绑定
B* pB = (B*)pA;
pB->f(); //B::f
pB->g(); //B::g

return 0;
}
[/Quote]
zhaojia268115 2009-02-24
  • 打赏
  • 举报
回复
输出:
A::f
B::g
B::f
B::g

原因:虚函数,在某个基类上建立起来的类的层次构造中,可以对任何一个派生类的对象中的同名过程进行调用,而被调用的过程提供的处理可以随其所属的类而变
所以每次调用虚函数时都调用是基类的非虚函数
夹心饼干 2009-02-24
  • 打赏
  • 举报
回复
A::f
B::g//在B中重写了void g(void),可以看多态的基本用法
B::f B* pB = (B*)pA强制转换后,pB直接跳过基类的地址指向对应的派生类
B::g
feng4206yu 2009-02-24
  • 打赏
  • 举报
回复

int main()
{
A* pA = new B;
pA->f(); //A::f 非虚函数,通过指针类型绑定
pA->g(); //B::g 虚函数,通过指针所实指类型动态绑定
B* pB = (B*)pA;
pB->f(); //B::f
pB->g(); //B::g

return 0;
}

64,654

社区成员

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

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