RT。。面试常问的题
This is A..
This is A..
首先c++的虚函数机制是用来实现面向对象编程时的多态机制的。多态(Polymorphism)是允许你将父对象设置成为与一个或更多的他的子对象相等的技术。
简单的说:就是允许将子类类型的指针赋值给父类类型的指针。这样在定义一个基类的指针对象p1后,可以通过p1来调用各个子类的函数以实现对基类函数的重写。
示例代码1:
#include<iostream>
using namespace std;
class A
{
public:
void print()
{
cout<<"This is A.."<<endl;
}
};
class B:public A
{
public:
void print()
{
cout<<"This is B.."<<endl;
}
};
int main()
{
A a;
B b;
a.print();
b.print();
}
运行结果:
This is A..
This is B..
确切的说,虽然输出结果不同,但这里并不叫真正实现了多态。原因是多态还有1个关键之处,就是一切用指向基类的指针或引用来操作对象,以实现对基类函数的重写。
于是把上面的代码改成按指针引用,变成示例代码2:
#include<iostream>
using namespace std;
class A
{
public:
void print()
{
cout<<"This is A.."<<endl;
}
};
class B:public A
{
public:
void print()
{
cout<<"This is B.."<<endl;
}
};
int main()
{
A a;
B b;
A* p1 = &a;//这里改写成按指针传递而类中声明和实现的部分不变
A* p2 = &b;
p1->print();
p2->print();
}
输出结果为:
This is A..
This is A..
为了解决基类按指针也能实现对各个子类函数的调用以输出不同的结果,这时候需要用到c++的关键字virtual . 直接加在基类的函数前即可(基类若是定义成纯虚函数,则子类中对应的函数全部默认为虚函数,不用再加关键字)。
示例代码3:
#include<iostream>
using namespace std;
class A
{
public:
virtual void print() //这里与示例2相比改成纯虚函数即可
{
cout<<"This is A.."<<endl;
}
};
class B:public A
{
public:
void print()
{
cout<<"This is B.."<<endl;
}
};
int main()
{
A a;
B b;
A* p1 = &a;
A* p2 = &b;
p1->print();
p2->print();
}
运行结果即为:
This is A..
This is B..
示例3才叫真正实现了多态。
另外,如果只想在基类中声明一个纯虚函数而不实现它,只需在函数后面加入"=0"即可。基类的函数声明成纯虚函数后,就可以在继承自它的子类下实现对基类函数的重写。
示例代码4:
#include<iostream>
using namespace std;
class A
{
public:
virtual void print()=0;//这里只声明不写实现
/*{
cout<<"This is A.."<<endl;
}*/
};
class B:public A
{
public:
void print()
{
cout<<"This is B.."<<endl;
}
};
int main()
{
//A a;
B b;
//A* p1 = &a;
A* p2 = &b;
//p1->print();
p2->print();
}
输出结果即为:
This is B..