一个面试题,求教!
class A
{
A() { printf("Construct A"; }; //1
~A() { printf("DisConstruct A"; };//2
}
class B: public A
{
B() { printf("Construct B"; };//3
~B() { printf("DisConstruct B"; };//4
main()
{
B b;
}
如果程序的执行结果是1234,请问这是什么原因导致的?
[解决办法]
面试官忽悠你呢吧
正确的结果 肯定是 13 4 2
[解决办法]
一时还想不出 帮你顶上去 等大牛来解释(不够感觉这也没什么合理的解释了)
[解决办法]
你讲的跟这题半毛钱关系都没有吧
个人以为:
在继承到一半的时候崩了,就是基类继承出现了问题,此时A已经构造完成,那么一旦异常,会自动调用~A,1和2就出来了。
B还是接着构造,接着析构。
[解决办法]
个人比较倾向10楼的说法
但如果是这种复杂情况的话 可能游离于C++标准或之外的 属于未定义的行为
[解决办法]
首先,你的程序存在很多错误,比如缺少‘;’,')',最后修改后是1 3 4 2
#include <stdio.h>
class A
{
public:
A() { printf("Construct A=1\n"); }; //1
~A() { printf("DisConstruct A=2\n"); };//2
};
class B: public A
{
public:
B() { printf("Construct B=3\n"); };//3
~B() { printf("DisConstruct B=4\n"); };//4
};
void main()
{
B b;
}
结果是:
Construct A=1
Construct B=3
DisConstruct B=4
DisConstruct A=2
Press any key to continue
[解决办法]
你直接回复:不存在1234的情况,或者已经发生了C++标准定义之外的行为。
[解决办法]
能不能用汇编把内存地址错乱了,然后达到题目所说的要求,看似荒谬,但是除了这个方法实在想不出什么好的方法了。
------解决方案--------------------
什么公司?做什么的?
[解决办法]
是不是因为刚执行B b;这一句的时候,main线程就结束了,所以在构造的时候对象也刚好析构了。。。
[解决办法]
#10是不科学的.一个异常被抛出之后,如果遇不到合适的catch,会相继调用uncaught_exception和terminate等函数而结束,不会自动调用析构函数,更不会继续往下执行子类的构造过程.而基类对象的构造过程是无法单独try-catch的.使用
楼主想要在完全不改变任何代码的情况下追求一个合理的解释,我感觉这个愿望不太现实.我更情愿把这个面试题当成是一个代码填空游戏.
当然,如果有大神能给出合理的解释,那就只能膜拜+学习了.