阿里吧吧的C++面试题

bianhao06 2009-09-23 09:02:42
1.struct A{
void fun1()
{cout<<"1";}
}
struct B:public A{
void fun2(A *a)
{cout<<"2";}
}
void main()
{
A a;
B *b=static_cast<B*>(a);
b->fun2(&a);
cout<<3<<endl;
}
2.struct A{
void fun1()
{cout<<"1";}
}
struct B:public A{
void fun2(A *a)
{cout<<"2";}
}
void main()
{
A a;
B *b=dynamic_cast<B*>(a);
b->fun2(&a);
cout<<3<<endl;
}
3.struct A{
virtual void fun1()
{cout<<"1";}
}
struct B:public A{
virtual void fun2(A *a)
{cout<<"2";}
}
void main()
{
A a;
B *b=static_cast<B*>(a);
b->fun2(&a);
cout<<3<<endl;
}
4.struct A{
virtual void fun1()
{cout<<"1";}
}
struct B:public A{
virtual void fun2(A *a)
{cout<<"2";}
}
void main()
{
A a;
B *b=dynamic_cast<B*>(a);
b->fun2(&a);
cout<<3<<endl;
}
第一道题大概是这样的,主要要说出这四段代码的运行结果,是编译出错还是运行错误还是输出数字,最后一个是输出3,但是也不是很明白,我也大概记得主要的代码是这个样子。
请前辈解释下 输出结果 和原因
还有一个题目是这个样子的
char * p1;
void main
{
char a[100];
char *p2 = (char *)malloc(1000000);
p1=(char *)malloc(1000000);
}
问题是问我以上3个东西的内存分配在哪里, 我回答p1在全局数据区 其他都在栈中。
后面一个问题说程序导致栈溢出,最有可能是那句出错了。我也不是很明白这个!!请指点一下。


...全文
635 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Steven_0610 2009-09-25
  • 打赏
  • 举报
回复
学习
bianhao06 2009-09-24
  • 打赏
  • 举报
回复
第四个也是运行时错误!!不知道是什么原因!
piaomiaoju 2009-09-24
  • 打赏
  • 举报
回复
mark
wbgxx 2009-09-24
  • 打赏
  • 举报
回复
ding ding
bianhao06 2009-09-24
  • 打赏
  • 举报
回复
hairetz 大哥 谢谢你的解答前面3个我看明白了 自己也理解了一下,但是第四个是什么意思!!
TianYiXiang 2009-09-24
  • 打赏
  • 举报
回复
A a;
B *b=operator_cast <B*>(a);
//这样的转换都不能转换的吧!
  • 打赏
  • 举报
回复
第一题去掉一些;以及&这些基本的语法错误之后,结果是23.

因为static_cast是强制转换,不做类型检测。
而函数是在类声明的时候就存在。之后fun2不是虚函数,则转换后,可以通过B*对象来调用。

第2题dynamic_cast会出错

第3题会报错,虽然static_cast成功了,但是fun1,fun2都是虚函数,是动态绑定,b对象调的函数,还是在A声明里查找,找不到fun2函数。
bianhao06 2009-09-24
  • 打赏
  • 举报
回复
4楼的 大哥能不能解释一下你怎么得出的第一题的答案??最后一个程序是输出3的,这个是面试官告诉我的!!
hyram 2009-09-24
  • 打赏
  • 举报
回复
学习
forster 2009-09-24
  • 打赏
  • 举报
回复
1 运行结果23
2 编译错
3,4 运行错

1 没问题 call函数直接call的fun2绝对地址
2 没虚函数 不能用dynamic_cast
3 通过A对象的虚函数表来找B的fun2的函数地址 肯定错
4 B *b=dynamic_cast<B*>(&a);失败 b为NULL 空指针

原理是是这样的 不知道用规则的术语咋说
love_route 2009-09-24
  • 打赏
  • 举报
回复
第四个错误原因是因为在struct A中没有fun2()函数的声明,当然找不到fun2()函数了
如果将struct A中的func1改为func2 则就不会出错了

[Quote=引用 13 楼 bianhao06 的回复:]
第四个也是运行时错误!!不知道是什么原因!
[/Quote]
24K純帥 2009-09-24
  • 打赏
  • 举报
回复
哎,我还纠结要不要投阿里巴巴
ljz888666555 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bianhao06 的回复:]
第四个也是运行时错误!!不知道是什么原因!
[/Quote]

class B {virtual void f();};
class D : public B {virtual void f();};

void f() {
B* pb = new D; // unclear but ok
B* pb2 = new B;

D* pd = dynamic_cast<D*>(pb); // ok: pb actually points to a D
D* pd2 = dynamic_cast<D*>(pb2); // pb2 points to a B not a D
}
bianhao06 2009-09-24
  • 打赏
  • 举报
回复
第二个是语法错误,因为动态强制类型转换参数必须是多态类型,而第四个运行错误是因为动态绑定的关系,所以和第三个一样 找不到要调用的函数fun2()。我这样理解吧!

samsinx 2009-09-24
  • 打赏
  • 举报
回复
1,output:23
2,syntax error, so cause compilation error
3,4 running error

---
p1: program's data segment.
a[],p2: current stack frame.
zgjxwl 2009-09-23
  • 打赏
  • 举报
回复
p1在全局数据区
a和p2在栈区

malloc的再堆上
zgjxwl 2009-09-23
  • 打赏
  • 举报
回复
char * p1; 
void main()
{
char a[100];
char *p2 = (char *)malloc(1000000);
p1=(char *)malloc(1000000);
}


这个会导致栈溢出?
cattycat 2009-09-23
  • 打赏
  • 举报
回复
上面4个只有1可以执行,2编译错误,3,4运行时错误。
第二个只有a分配在栈上,其他都在堆上。
zgjxwl 2009-09-23
  • 打赏
  • 举报
回复
1.
struct A
{
void fun1()
{
cout <<"1";
}
};
struct B:public A
{
void fun2(A *a)
{
cout <<"2";
}
};
void main()
{
A a;
B *b=static_cast <B*>(&a);
b->fun2(&a);
cout <<3 <<endl;
}

2.
struct A
{
void fun1()
{
cout <<"1";
}
};
struct B:public A
{
void fun2(A *a)
{
cout <<"2";
}
};
void main()
{
A a;
B *b=dynamic_cast <B*>(&a);
b->fun2(&a);
cout <<3 <<endl;
}

3.
struct A
{
virtual void fun1()
{
cout <<"1";
}
};
struct B:public A
{
virtual void fun2(A *a)
{
cout <<"2";
}
};
void main()
{
A a;
B *b=static_cast <B*>(&a);
b->fun2(&a);
cout <<3 <<endl;
}


4.
struct A
{
virtual void fun1()
{
cout <<"1";
}
};
struct B:public A
{
virtual void fun2(A *a)
{
cout <<"2";
}
};
void main()
{
A a;
B *b=dynamic_cast<B*>(&a);
b->fun2(&a);
cout <<3 <<endl;
}



排版放上来。。。应该是这样吧
quan123a 2009-09-23
  • 打赏
  • 举报
回复
第二个问题,a、p2在数据栈上,p1在全局数据,a导致栈溢出的可能性最大,因为其的内存分配在数据栈,p1、p2的内存分配在堆上
加载更多回复(1)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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