一直以来,对c++的虚函数,纯虚函数搞不清楚,今天趁着今晚c++考试的机会,把这些东西狠狠的看了一下,总算理清了一些思路。分享给大家,望能够对还不清楚这些东西的同学有所帮助。哈哈......~
1、首先搞清楚C++为什么要有虚函数,个人认为是为了实现多态的功能,而多态又是建立在继承的基础上。因此我们可以认为虚函数最好只用在有继承结构的对象层次中。在实现c++多态时,如果只是使用普通的继承。即基函数中每个函数的声明都只是使用普通类中成员函数的声明方法,则达不到多态的效果,即即使将基类指针指向其派生类的对象,调用的也只是基函数中该函数的实现。
说到这里,我一直以来有一个很困惑的问题,那就是能不能在派生类中声明基类中没有的成员函数,而使用多态性进行调用(使用指向派生类对象的基类指针调用该函数),首先说明这是极端错误的,不可能的(真佩服自己怎么会有这样的傻问题,呵呵!!)。要使这样能调用成功,其基类中必须有该函数的声明。未免大家对我的语言表达不是很理解,我写一段程序说明一下(呵呵):
class A
{
private:
int a;
public:
A(int x){a=x;}
int get(){return a;}
};
class B1 : public A
{
private:
int b1;
public:
B1(int x) : A(x){b1=x;}
void print(){cout<<b1<<endl;}
};
我在main函数中写下如下代码:
A *pa;
pa = new B1(1);
pa->print();
呵呵,写到这里,已经能说明我要表达的问题,大家看pa->print()能成功吗?答案是否定的!会给出编译错误!以前我一直以为这样是可以的,唉,对c++还是不是很熟悉啊!
如果要想实现多态,则必须要在基类中声明要实现多态的函数,这个函数必须在基类中声明为虚函数(或纯虚函数),这样调用时才会调用的是派生类的成员,换句话说就是实现运行时动态连编(绑定dynamic binding)。
还有要注意的是,虚函数在基类中可以有实现版本,但如果声明为纯虚函数,则不允许有实现版本,且只能在派生类中实现,此时此基类就成为了抽象类,而且这个抽象类是不能产生对象的,只能用来继承。
就说到这里了。。。