from:http://blog.sina.com.cn/s/blog_7ebe664201015vkv.html
1、
#include <iostream>
using namespace std;
class A{
public:
A() {func(0);};
virtual void func(int data) {printf("A1 :%d\n",data);}
virtual void func(int data) const {printf("A2 :%d\n",data);}
void func(char *str) {printf("A3 %s)\n",str);}
};
class B:public A{
public:
void func() {printf("B1 :%s\n","");}
void func(int data) {printf("B2 :%d\n",data);}
void func(char *str) {printf("B3 %s)\n",str);}
};
int main()
{
A *pA;
B b;
const A *pcA;
pA=&b;
pA->func(1);
pA->func("test");
A().func(1);
pcA=&b;
pcA->func(2);
return 0;
}
程序运行的结果:
A1 :0
B2 :1
A3 test)
A1 :0
A1 :1
A2 :2
1) 基类的指针指向派生类对象:那么该指针只能够调用基类所定义的函数,但是如果该函数为虚函数,则调用该派生类自己的成员
函数。(B2 :1)
2) 如果以派生类的指针指向基类对象,则必须事先做明显的转型操作,但是这种做法很危险。
**************************************************************************************************
2、
#include <iostream>
using namespace std;
template <typename T>
void func(const int &t)
{
cout<<t+100<<endl;
}
template <typename T>
void func(const T &t)
{
cout<<t<<endl;
}
int main()
{
func(10.3);
func(1000);
return 0;
}
程序运行结果:10.3
1000
如果上述函数改为
#include <iostream>
using namespace std;
void func(const int &t)
{
cout<<t+100<<endl;
}
template <typename T>
void func(const T &t)
{
cout<<t<<endl;
}
int main()
{
func(10.3);
func(1000);
return 0;
}
则程序的运行结果为:10.3
1100
如果使用函数的非模板形式,不能在前面加上template关键字。
分析:
你在VC++环境下进行Debug调试,会发现:
1)如果语句(1)没有注释掉,程序运行时,函数 func(10.3)和func(1000)的调用,使用的模板函数为如下版本:
template<typename T>
void func(const T &t)
{
cout<<t<<endl;
}
因此此时结果为10.3,1000。
2)如果把语句(1)注释掉,则:
func(10.3)运行,调用使用的模板函数为如下版本:
template<typename T>
void func(const T &t)
{
cout<<t<<endl;
}
func(1000)运行,调用使用的是函数(不是调用模板函数):
void func(const int &t)
{
cout<<t+100<<endl;
}
因此结果为:10.3,1100
原因解释: 1)没有注释掉代码(1)情况下,编译器均使用第二个模板函数来进行编译(func(1000)第一个模板函数不能实例化 因为不含模板参数T); 2)注释掉代码(1)情况下,func(整数)匹配,优先调用函数。 也就是说,在满足函数匹配的情况下,编译器优先使用函数匹配编译,函数不能匹配情况下,再使用模板匹配。***************************************************************************************************
3、改错:
#include <iostream>
using namespace std;
class klass
{
public:
klass(){}
private:
~klass(){}
void func(int n){
cout<<"klass!!"<<endl; }
public:
void test()
{
func(100);
}
};
int main()
{
klass k;
k.test();
/ *klass *pk;
pk=new klass;
pk->test();* /
//程序通过,但是klass不能释放
return 0;
}
运行后程序显示:error C2248: 'klass::~klass' : cannot access private member declared in class 'klass'证明析构函数的属性必须为public。
但是,如果把klass k改为klass* pk; pk=new klass; pk->test();程序通过,但是klass不能释放.
**************************************************************************************************
趋势的笔试题(zz)
1,你有5瓶药,每个药丸重10克,只有一瓶受到污染的药丸重量发生了变化,每个药丸重9克。给你一个天平,你怎样一次就能测出哪 一瓶是受到污染的药呢?
2. 十个苹果,有一个不同.或轻或重.称三次.
3,有4个女人要过一座桥。她们都站在桥的某一边,要让她们在17分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最 多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必要带着手电筒。手电筒必须要传来传去,不能扔过去。每个 女人过桥的速度不同,两个人的速度必须以较慢的那个人的速度过桥。第一个女人:过桥需要1分钟;第二个女人:过桥需要2分钟 ;第三个女人:过桥需要5分钟;第四个女人:过桥需要10分钟。
***************************************************************************************************
答案 1.
***************************************************************************************************
答案2. 1) 先取4个苹果,一边2个放天平.结果有A和B2种:
**************************************************************************************************
答案3. A(1min) B(2min) C(5min) D(10min)
**************************************************************************************************
class CDemo
{
public:
CDemo() : str(NULL) {};
~CDemo() { if (str) delete [] str;}
CDemo(const CDemo& x):str(0){
if(x.str){
str = new char[strlen(x.str)+1];
strcpy(str, x.str);
}
}
CDemo& operator=(const CDemo& x){
if(this == &x)
delete []str;
str = 0;
if(x.str){
}
return *this;
}
char *str;
};
两次析构其实是对CDemo中的str引用的内存进行了两次析构,分别是d1的析构和delete a1发生的析构。只要在CDome中,当CDome的对象发生拷贝构造或拷贝时,就将str指向不同的内存即可。所以会在拷贝构造函数和复制操作符中,从新申请一块内存并把源字符串拷贝到新的内存中就OK了
1.5 Which of the following class DOES NOT need a copy constructor?
答案:c
***************************************************************************************************
1.6 What is the color of the pixel at x,y?
int x = 100,y = 100;
putpixel(x,y,RED);
if(getpixel(x,y)==RED)
{
putpixel(x,y,GREEN);
}
if(getpixel(x,y)==BLUE)
{
putpixel(x,y,YELLOW);
}
if(getpixel(x,y)==GREEN)
{
putpixel(x,y,BLUE);
}
a.RED
答案:d
****************************************************************************************************
1.7 What is the output of the following code?
void turn_left(int dir)
{
}
void turn_right(int *p_dir)
{
*p_dir = (*p_dir + 1);
}
int main()
{
int dir1 = 3, dir2 = 3;
turn_left(dir1);
turn_right(&dir2);
printf(“%d %d”,dir1,dir2);
return 0;
}
a.3 3 b.3 4 c.2 3 d.none of the above
答案:b
****************************************************************************************************
1.8 Which virtual function redeclarations of the Derived class are correct?
a. Base* Base::copy(Base*); Base* Derived::copy(Derived*);
b. Base* Base::copy(Base*); Derived* Derived::copy(Base*);
c. ostream& Base::print(int,ostream&=cout); ostream& Derived::print(int,ostream&);
d. void Base::eval_r() const; void
答案:c
overload和override的区别:
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
***************************************************************************************************
今年趋势的一个笔试题 呵呵,当时看了真是觉得搞笑啊,这简直是恶搞题……小明每周一到周五要去上学,周末休息。今天早上小明没有刷牙,这是为什么呢?请给出尽量多的原因。
***************************************************************************************************
趋势的待遇很好,听说有8000左右一个月,流口水ing。上午10:30的面试,我提前半小时就到了,遇到了很多其他高校的帅哥,在和他们的聊谈过程中,我知道,他们竟都是硕士生,参加这次面试的有100位,最后只招二三十个。顿感压力巨大啊。 很准时,10:30,我被叫进去开始面试了.面试官是个四十出头的很和蔼先生,穿的也很随便,也许这就是趋势的企业文化?整个面试过程感觉还不错,技术问题基本都答上来了,一些开放性的问题答的也还可以,只是我有点紧张,感觉得出我地声音有点颤抖.下面我简单罗列下我碰到的问题:
1、简单介绍一下你做的项目
2、sturct和class的区别
3、虚函数和纯虚函数的区别,作用
4、有没有碰到过内存泄漏,怎么解决 5、老师对你的评价
6、你认为哪个老师比较牛,为什么?
7、同学们怎么评价你的,你同学认为你哪方面比较牛?
8、平时有什么兴趣和爱好
8、简单谈谈你对趋势的看法
走出地铁大厦,我还是很自信的.回到宿舍后突然我发现我那装简历的档案袋没拿,我顿时后悔起来,这是一个很严重的错误,从这个小小的疏忽,可以看出我的紧张,大意。这在工作中是万万要不得的.我想,就凭这一点,我是无望进入二面了.结果如我所料,没有收到下一轮的面试通知.这次失败的面试给了我惨痛的教训,以后无论做什么事,都要小心谨慎。 呵呵,凭我记忆写的首先是一堆智力题目,看图形选出不一样的,或者填出下一个然后是选择题,有一部分关于网络的,包括数据通信,什么路由器交换机之类的然后还有一些关于的,包括编程,呵呵考了一个原始套接字的,记住选就然后是一些大题。一道是数据结构的,链表的节点的反转,然后还有一道是写还是的原型来着。就记得这么多了,希望对师弟师妹有帮助。
***************************************************************************************************
2、sturct和class的区别:
STRUCT中的所有成员都是PUBLIC的,类中可以有PUBLIC,PRIVATE,PROTECTED。 STRUCT中不能包含成员函数但是CLASS中可以包括成员函数.class和struct的最基本的区别就是:在class中,在默认的情况下,它的成员是私有的,而在struct中,默认的情况下,它的成员是公有的!但是在一般编程的习惯中,在struct中一般只定义数据部分,而在class中一般都定义了数据部分和对这些数据操作的方法!
3、虚函数和纯虚函数的区别,作用
纯虚函数就是没有函数体的,必须在派生类中重载的函数。虚函数可以有函数体,如果派生类中没有重载函数,则调用父类的函数 class a { virtual b()=0;//纯虚函数 virtual c(){...}//虚函数 }; 虚函数主要实现多态机制避免二义性问题,至于纯虚函数是抽象类机制,基类提供接口,派生类提供实现,抽象类不能定义对象。最大区别:有纯虚函数的类不能定义对象。 基本来说纯虚函数是必须被重载的,因此在被用来做基类的抽象类中肯定有一个或多个纯虚函数。 而虚函数可以在继承类中被重载,也可以不。 二者都是体现了c++的多态性
纯虚函数:
(1).表明该纯虚函数所属的类仅做为接口使用,不能实例化(即不能生成一个该类的对象).
(2).接口类的子类(derived class)必须override每个纯虚函数,使之成为非纯虚函数后,该类才能产充许产生实例;
(3).纯虚函数可以有该函数的定义,有可以没有.但纯虚析构函数必须要有定义. 如果一个接口类只有它的析构函数的纯虚的,那么,该接口类的子类可以不必显式overriden接口类的析构函数,编译器自动产生的析构函数就可以overriden接口类的析构函数,使子类自动成为一个可实例化的普通类.
4、有没有碰到过内存泄漏,怎么解决
就是使用内存资源后没有被回收。 在java中,用new在堆上分配的内存资源都会被java的garbage collector自动回收当一个类的实例不再被其它的任何变量引用的时候,它就有资格被回收,但是并不是一定会被回收,如果没有被回收,则就会产生内存泄露。 对,单元测试,一个一个得试,看是哪个模块出了问题。有点费时间,但这个最保险了代码的规范性很重要。
***************************************************************************************************