帮忙分析一段C++代码

奋斗的IT青年 2013-03-23 11:01:44
刚接触C++,碰到一段代码 ,帮忙看下。谢谢了
#include <iostream>
using namespace std;

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

int main()
{
B b;
return 0;
}


运行结果:I am A
为什么class B虚函数不执行呢?
...全文
176 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
haolly 2013-03-23
  • 打赏
  • 举报
回复
楼上已经说的很清楚了,派生类构造时先要调用父类的构造函数,然后调用自己的构造函数。 而父类中调用了doSth(),这时就输入了a。 子类的构造函数是默认生成的,没有调用什么函数,没有输出
Freedom 2013-03-23
  • 打赏
  • 举报
回复
你继承了A 当你用B构造一个对象那么就要先调用父类的的构造函数,再调用自己的构造函数,如果是析构函数就相反 先析构B在去析构A 你这里doSth是虚函数B继承A那么在内存里其实我们有个虚表记录着虚函数,如果你B中没有声明doSth那么你B b b.doSth就是调用父类的doSth方法,但是这里你声明了,而且你还没有调用这个方法,B类里也没有够着函数那么它就执行父类的构造函数,而你构造函数里有调用了doSth这个方法所以执行结构就是I am A
gfchen1989 2013-03-23
  • 打赏
  • 举报
回复
B b先构造基类对象就是A,A构造函数中doSth调用的是自己的,然后构造子类对象就是B了,B调用的默认的缺省构造函数,当然不执行doSth了
无间虚者 2013-03-23
  • 打赏
  • 举报
回复
B类继承A类,所以B类的对象应该调用A类的构造函数。如果,想要执行B类中的函数需要明确指明对象b去调用该函数。 个人愚见。
sniffer12345 2013-03-23
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
	public:
		A()
		{
			A::doSth();//事实上是这样。。
		}
		virtual void doSth()
		{
			cout<<"I am A"<<endl;
		}
};
class B:public A
{
	public:
		virtual void doSth()
		{
			cout<<"I am B"<<endl;
		}
};

int main()
{
	B b;
	return 0;
}

64,651

社区成员

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

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