前段时时间辞职了,之前一直是从事linux应用程序开发,用的一直是c语言。老实说,c语言真的不是很好用,尽管其很高效,但是毕竟是面向过程的低级语言,开发起来很多东西都需要自己重新实现,第三方库可用的也比较少,因此大大的增加了开发时间。因此我决定要向高级的语言进行过渡,从相似性来说无疑c++是何其最接近的。奈何c++也是号称最难的语言啊,学习过程中也是有很多疑难杂症,因此打算来个一天一道c++面试题,以便巩固学习。
前两天去面试了一家安防监控的公司,做了一份c++面试题,里面有一道关于多态的题我映像很是深刻,代码如下:
class A
{
public:
A(int a,int b):
m_a(a),
m_b(b)
{
}
A(){
m_a=0;
m_b=0;
}
//virtual void show()
void show()
{
cout << "addr:"<< &m_a <<" "<<m_a << endl;
cout << "addr:"<< &m_b <<" "<<m_b << endl;
}
protected:
int m_a,m_b;
};
class B: public A
{
public:
B(int a,int b):
m_a(a),
m_b(b)
{
}
B(){
m_a=0;
m_b=0;
}
//virtual void show()
void show()
{
cout << "addr:"<< &m_a <<" "<<m_a +1 << endl;
cout << "addr:"<< &m_b <<" "<<m_b +1 << endl;
}
protected:
int m_a,m_b;
};
int main()
{
A *t1;
B t2(1,2);
t2.show();
t1=&t2;
t1->show();
}
输出结果为:
addr:0x61fe94 2
addr:0x61fe98 3
addr:0x61fe8c 0
addr:0x61fe90 0
其打印结果显示表明,这种情况下,变量为什么类型,使用的函数就是该类型成员及函数,这种情况被称为静态多态,或者叫静态链接。
当在show()函数前加入virtual关键字的时,打印结果为:
addr:0x61fe94 2
addr:0x61fe98 3
addr:0x61fe94 2
addr:0x61fe98 3
可见,此时变量使用的成员及函数与实例化有关,实例化是什么类型,那么该实例空间使用的函数就是该实例真正的成员函数,这样就做到了与声明的变量无关,至于实例化有关,为动态链接。
virtual标记的函数为虚函数,左右就是为子类预留一个函数接口,让子类来进行实现并使用。
参考链接:http://www.runoob.com/cplusplus/cpp-polymorphism.html