测试你的c++水平

chrischeng03 2011-04-28 05:02:23
看以下代码:

class Father{
public:
virtual void sayHello(){
cout<<"hello Father!!"<<endl;
}
~Father(){
cout<<"~Father()"<<endl;
}
};
class Child:public{
void sayHello(){
cout<<"hello Child!!"<<endl;
}
~Child(){
cout<<"~Child()"<<endl;
}
};

void SayHello(Father f,Father& f1,Father* pF){
f.sayHello();
f1.sayHello();
(*pF).sayHello();
}

void main(){
Child c;
SayHello(c,c,&c);

Father* f=new Child;
delete f;
}
问题:以上输出结果是什么?
扩展:
如果SayHello(Father f,Father& f1,Father* pF)变成:
SayHello(const Father f,const Father& f1,const Father* pF);
结果会怎样?如果这些问题都能顺利回答,那么你对c++的面向对象以及多太有一定程度的了解了
原文或答案解析:http://www.caravelsoft.com/forum/forum-1/forum-7/topic-29/
...全文
742 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangzhijunbest 2011-11-01
  • 打赏
  • 举报
回复
1.hello Father!! 2.hello Child!! 3.hello Child!! 4 ~Father() 5~Father()
GuuJiang 2011-04-29
  • 打赏
  • 举报
回复
别的先不说,Child继承Father本身就不是一个正确的OO示例
dy2219 2011-04-29
  • 打赏
  • 举报
回复
谢谢楼主的转贴分享,这是个挺有意思的c++测试题。
但是如果楼主能事先自己调试一下代码就更好了,原帖的代码就是错的,楼上的各位已经指出了。

我想说的是SayHello(c,c,&c)这个函数,它使用了直接以值传递的对象作为参数。这在实际中是很危险的。首先对象Father f会以bit copy的形式创建,然后函数运行结束时会启动新对象的析构函数。这样就凭空多了一次对本来定义在函数以外的对象Child c的析构,这很可能造成过早释放资源,产生野指针。

这个问题可以再引申一下,试试在Father类的定义中加入

private:
Father(Father&);

这样会防止对象作为以值传递的函数参数。

或者加入

public:
Father() { cout << "default constructor called!"<< endl;};
Father(Father& f) { cout << "copy constructor called!" << endl; };

这样会看到2种不同构造函数分别被启动。

最后迂腐一下,这个题目代码违背了2条C++的代码原则:
(1)有多态时,析构函数一定要定义为虚函数(楼上已经提过了)
(2)对象作为以值传递的参数时,一定要专门定义copy constructor
SimonYeung 2011-04-28
  • 打赏
  • 举报
回复
sl09123823 2011-04-28
  • 打赏
  • 举报
回复
都是大神级呀后生佩服看来我这菜鸟还有的学呀
jiiming 2011-04-28
  • 打赏
  • 举报
回复
[code=C/C++]class Child: public father{
void sayHello(){
cout<<"hello Child!!"endl;
}
/code]
jiiming 2011-04-28
  • 打赏
  • 举报
回复
class Child:public{
void sayHello(){
cout<<"hello Child!!"<<endl;
}

这段代码有点问题,我认为是下面这个样子的:

class Child: public father
void sayHello(){
cout<<"hello Child!!"endl;
}
xmu_才盛 2011-04-28
  • 打赏
  • 举报
回复
变成 const后 有区别吗? 形参不都该是 父类的就是父类, 该是子类的就是子类?

我觉得编程const后没区别
zhengjiankang 2011-04-28
  • 打赏
  • 举报
回复
别在bs楼主了。
在说人家要崩溃了。
没编译运行的代码都贴出来了。
汗。
sghdls 2011-04-28
  • 打赏
  • 举报
回复


被标题吸引进来了
龙哥依旧 2011-04-28
  • 打赏
  • 举报
回复
扯淡贴
ssbb94 2011-04-28
  • 打赏
  • 举报
回复
1.题目首先就不对,child类没写父类是哪个,子类定义的两个函数都是private的,这样编译就报错.应该改成这样

#include <iostream>
using namespace std;

class Father{
public:
virtual void sayHello(){
cout<<"hello Father!!"<<endl;
}
~Father(){
cout<<"~Father()"<<endl;
}
};
class Child:public Father{
public:
void sayHello(){
cout<<"hello Child!!"<<endl;
}
~Child(){
cout<<"~Child()"<<endl;
}
};

void SayHello(Father f,Father& f1,Father* pF){
f.sayHello();//执行Father的sayHello
f1.sayHello();//多态,本题执行Child的sayHello
(*pF).sayHello();//多态,本题执行Child的sayHello
}//析构f,析构函数不是virtual的,执行Father的析构

void main(){
Child c;//构造Child对象c
SayHello(c,c,&c);//调用时,第一个参数按成员copy

Father* f=new Child;//构造Child对象
delete f;//析构f,析构函数不是virtual的,执行Father的sayHello
}//执行c的析构,先执行Child的析构,再执行Father的析构


答案:
hello Father!!
hello Child!!
hello Child!!
~Father()
~Father()
~Child()
~Father()

3.扩展问题有错误吧,要把形参改成const,成员函数也改成const才能调用
pathuang68 2011-04-28
  • 打赏
  • 举报
回复
第一眼看出代码不规范。
1. 漏写
class Child:public ->class Child:public Father
2. Father作为基类,析构函数居然不是virtual的。
当然这也不能绝对算错。在不准备在这两个类上使用polymorphism的时候,应该是正确的,反之,就是错误的。而Father* f=new Child;这里明显使用了polymorphism,这会导致delete f的时候,Child的析构函数不会被调用,从而导致memory leak。

都是一个合格的C++程序员应知应会的问题。
子达如何 2011-04-28
  • 打赏
  • 举报
回复
另外,纠正一个错误:
class Child:public{
===》
class Child:public Father{
恨天低 2011-04-28
  • 打赏
  • 举报
回复
hello Father!!
hello Child!!
hello Child!!
~Father()
~Father()
~Child()
~Father()
子达如何 2011-04-28
  • 打赏
  • 举报
回复
先回一个再看答案
hello Father!! //f.sayHello();
hello Child!! //f1.sayHello();
hello Child!! //(*pF).sayHello(); ==>其实就是pF->sayHello();

~Father() // SayHello函数的临时变量的析构
~Father() // delete f;因为Father的析构函数没有virtual,因此无法正确调用Child的析构函数
// 这是一个设计错误!应该避免
~Child() // main函数的局部变量c的析构
~Father() // c的析构自动调用Father的析构
blackstar8888 2011-04-28
  • 打赏
  • 举报
回复
楼上的大牛们当然不在话下
梦之安魂曲 2011-04-28
  • 打赏
  • 举报
回复
都回答也不代表技术很好。
就想叫yoko 2011-04-28
  • 打赏
  • 举报
回复
还有就是child里面的函数都没写public默认为private了[Quote=引用 1 楼 healer_kx 的回复:]

class Child:public ?
[/Quote]
就想叫yoko 2011-04-28
  • 打赏
  • 举报
回复
hello father
hello child
hello child
~father
~father
~child
~father

最后那个delete大意了一下, 应该要virtual ~father 的
加载更多回复(2)

64,281

社区成员

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

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