本篇blog旨在收集平时遇到的一些“稀奇古怪”的面试题。
问题1
问题表述:
在C++中,为了让某个类只能通过new来创建(即如果直接创建栈上对象,编译器将报错),应该如何做?
解析:
将析构函数设为私有。
因为new的过程中,编译器不会检测析构函数是否可访问,但要注意的是,这将导致不能调用delete删除该对象所占用的内存,所以需要在该类的内部自己增加一个成员函数,在该自定义函数中使用delete this的方式清除对象的内存。
问题2
问题表述:
如下一段代码的执行结果是?
#include <iostream>
using namespace std;
class A{
public:
virtual void fun(int a = 1){
cout << "A->" << a << endl;
}
virtual void test(){
fun();
}
};
class B : public A{
public:
virtual void fun(int a = 0){
cout << "B->" << a <<endl;
}
};
int main(){
B * p = new B;
p->test();
return 0;
}
解析:
由于p指向了派生类B的对象,所以,在调用A中的test之后,虚函数func()会调用派生类B的函数,而默认形参仍然会使用test所在的A类的形参1,从而输出B->1.
问题3
问题表述:
代码如下,bar1,bar2和bar3,哪个函数将编译出错:
class A{
public:
virtual void foo();
}
class B{
public:
virtual void foo();
}
class C : public A, public B{
public:
virtual void foo();
}
void bar1(A * pa){
B * pc =