下面输出啥???为啥???

来源:百度知道 编辑:UC知道 时间:2024/06/25 11:25:54
#include <stdio.h>
class A1
{
public:
A1(){ doSth(); }
virtual void doSth(){printf("I am A\n");}
void test() {doSth();}
};
class B1:public A1
{
public:

virtual void doSth(){ printf("I am B\n");}
};

void main()
{
B1 *b = new B1;
b->test();
}

这个问题,我到有些研究
这样的
这里首先new B1,在new B1的时候由于B1是继承A1,所以会先调用A1的构造函数,a的构造函数A1(){ doSth(); },显然就是printf("I am A\n")。,然后在时调用b1的构造函数,b1的构造函数没有,这里系统会自动给一个,但是系统的构造函数是什么事都不做的。
b->test();这个毫无疑问是输入I am b;
再和你说说另外一种
A1 *a=new B1;
A1->test();会是什么效果呢?
你可以到电脑上试一下,这里的输出和原来的输入时一样的。
第一printf("I am A\n")这个和上面同理,但是A1->test();输出I am b是怎么回事呢?这里就涉及到虚函数了,这个就是虚函数继承的概念。因为A virtual void doSth(){printf("I am A\n");}在new B1的时候被重写了,重写后的函数就是virtual void doSth(){ printf("I am B\n");}。这个概念就是动态编联了。楼主有必要去研究下继承和派生以及虚函数,这里的谁很深

I am B\n

I am A
I am B

new B1;时调用a的构造函数-构造函数里调用了a的 dosth方法:I am A
b->test();调用a的test方法-在调用dosth方法,但是dosth已经被重载了,所以:I am B