求输入:
class
A
{
public
:
void
foo()
{
printf(
"1"
);
}
virtual
void
fun()
{
printf(
"2"
);
}
};
class
B:
public
A
{
public
:
void
foo()
{
printf(
"3"
);
}
void
fun()
{
printf(
"4"
);
}
};
int
main(
void
)
{
A
a;
B
b;
A
*p = &a;
p->foo();
p->fun();
p
= &b;
p->foo();
p->fun();
A
*ptr = (A *)&b;
ptr->foo():
ptr->fun();
return
0
;
}
答案:B
1,首先声明为A类型的指针指向实际类型为A的对象,调用的肯定是A的方法,输出1 2,
2,然后声明为A类型的指针指向实际类型为B的对象,则非虚函数调用A的方法,输出1,虚函数调用实际类型B的方法,输出4
3,声明类型为A的指针指向实际类型为B的对象,进行一个强制类型转换,其实这种父类指针指向子类会自动进行类型转换,所以是否强制类型转换都不影响结构,原理同上一步,结果输出1 4
所以最终输出为121414
1,首先声明为A类型的指针指向实际类型为A的对象,调用的肯定是A的方法,输出1 2,
2,然后声明为A类型的指针指向实际类型为B的对象,则非虚函数调用A的方法,输出1,虚函数调用实际类型B的方法,输出4
3,声明类型为A的指针指向实际类型为B的对象,进行一个强制类型转换,其实这种父类指针指向子类会自动进行类型转换,所以是否强制类型转换都不影响结构,原理同上一步,结果输出1 4
所以最终输出为121414