虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数,虚函数只能借助于指针或者引用来达到多态的效果。
虚函数的语法:
1:class A{public: virtual void foo();};class B: public A{public: void foo(); // 没有virtual关键字!};class C: public B // 从B继承,不是从A继承!{public: void foo(); // 也没有virtual关键字!}; 这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。因此,可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字
2:纯虚函数:
一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。
3:纯虚构函数:
当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。
4:虚构造函数:
构造函数不能是虚的
5:虚函数使用技巧:
5.1:class A{public: void foo() { bar();}PRivate: virtual void bar() { ...}};class B: public A{private: virtual void bar() { ...}}; 在这个例子中,虽然bar()在A类中是private的,但是仍然可以出现在派生类中,并仍然可以与public或者protected的虚函数一样产生多态的效果。并不会因为它是private的,就发生A::foo()不能访问B::bar()的情况,也不会发生B::bar()对A::bar()的override不起作用的情况。这种写法的语意是:A告诉B,你最好override我的bar()函数,但是你不要管它如何使用,也不要自己调用这个函数。
5.2:构造函数和析构函数中的虚函数调用
一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如:class A{public: A() { foo();} // 在这里,无论如何都是A::foo()被调用! ~A() { foo();} // 同上 virtual void foo();};class B: public A{public: virtual void foo();};void bar(){ A * a = new B; delete a;} 如果你希望delete a的时候,会导致B::foo()被调用,那么你就错了。同样,在new B的时候,A的构造函数被调用,但是在A的构造函数中,被调用的是A::foo()而不是B::foo()。
参考:http://blog.csdn.net/bao_jinyu/article/details/7843275
新闻热点
疑难解答
图片精选