这个面试题怎么回答?

congcongying 2011-05-08 05:50:52
我被问到一个面试题,请大家帮我看看,

void log(std::string message);

class A {
public:
A(int id);
virtual ~A();
virtual std::string get_name()=0;
int get_id();
};

A::~A() {
log("Destroying: " + get_name());
}

a)不可能有子类因为A没有构造函数
b)get_name()不能再析构函数里调用
c) A里有一个纯虚函数,所以他的构造函数也必须是virtual
d) 析构函数里的+ operator不合法,因为左右操作数不同
e)析构函数只能销毁内存,不能调用函数


我当时选的是B, 请大家帮我看看,别的选项。
...全文
262 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
子达如何 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sheepcorpse 的回复:]

B,方法为空,不能调用,除非写了方法。
[/Quote]
很多人都说B,但是解析却是错误的:)
sheepcorpse 2011-05-09
  • 打赏
  • 举报
回复
B,方法为空,不能调用,除非写了方法。

其它答案一看就是错的没边的。
ljt3969636 2011-05-09
  • 打赏
  • 举报
回复

a)不可能有子类因为A没有构造函数//pass
b)get_name()不能再析构函数里调用//不是不能,是不应该,见effictive c++有表述
c) A里有一个纯虚函数,所以他的构造函数也必须是virtual//pass
d) 析构函数里的+ operator不合法,因为左右操作数不同//pass隐式转换,但是b已经说了不应该在构造或者析构中调用虚函数
e)析构函数只能销毁内存,不能调用函数//您是什么意思?析构函数自己销毁还是我手动销毁?但不管怎样后半句决定它PASS了

之后你反问:综上所述考官大人您认为我应该选哪个,这题是您出的吗?
fulima007 2011-05-09
  • 打赏
  • 举报
回复
我选B吧
shaotine_wu 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 super_admi 的回复:]

父类析构时,子类早已被销毁了吧?

引用 7 楼 wyget 的回复:
关于b) 如果纯虚函数有给出定义 就可以调用了啊~
[/Quote]
在析构函数中调用定义好的纯虚函数应该是可以的。这个时候调用的虚函数其实相对于基类来说就是一个普通的函数了。

#include<iostream>
using namespace std;
class test
{
public:
virtual ~test(){func();}
virtual void func()=0
{
cout<<"test func"<<endl;
}
};
class test1:public test
{
public:
~test1(){func();}
void func()
{
cout<<"test1 func"<<endl;
}
};
void main()
{
test1 tes;
}

虽然effect c++里有说到绝不在构造和析构函数中调用虚函数。可能他说的是要用到类的数据成员的情况吧,这个不是很清楚,坐等高人
super_admi 2011-05-08
  • 打赏
  • 举报
回复
这位兄弟莫非是英语老师?

[Quote=引用 10 楼 yfqvip 的回复:]
我选B
[/Quote]
满衣兄 2011-05-08
  • 打赏
  • 举报
回复
我选B
super_admi 2011-05-08
  • 打赏
  • 举报
回复
父类析构时,子类早已被销毁了吧?

[Quote=引用 7 楼 wyget 的回复:]
关于b) 如果纯虚函数有给出定义 就可以调用了啊~
[/Quote]
super_admi 2011-05-08
  • 打赏
  • 举报
回复
我不知道B对不对,但我知道A CDE都是错的。
wyget 2011-05-08
  • 打赏
  • 举报
回复
关于b) 如果纯虚函数有给出定义 就可以调用了啊~
qq120848369 2011-05-08
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public:
void interFace()
{
func();
}

protected:
virtual void func()=0;
};

class B:public A
{
public:
virtual void func()
{
cout<<"A"<<endl;
}
};

int main()
{
A *p=new B();

p->interFace(); //这样完全可以,因为调用的是B的func

//effective C++里有提到这种情况,也是很常见的设计

return 0;
}


但是楼主的虚函数在虚析构函数里调用,就肯定不行了.

调用基类虚析构函数的时候,所有子类已经析构结束了,调用的虚函数只能是自己的(纯虚的),而不是派生类的.
giveable-coding 2011-05-08
  • 打赏
  • 举报
回复
B是正确答案
無_1024 2011-05-08
  • 打赏
  • 举报
回复
试了一下只有B是对的
無_1024 2011-05-08
  • 打赏
  • 举报
回复
存续函数在自己被本身的类中是透明的 所以不能调用 我的认为
qq120848369 2011-05-08
  • 打赏
  • 举报
回复
virtual std::string get_name()=0;

纯虚方法,没法调用.

选择:B
KWDIWT 2011-05-08
  • 打赏
  • 举报
回复
应该是a

64,648

社区成员

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

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