虚函数与多态
除了继承外,C++的另一个优良特性是支持多态,即允许将派生类的对象当作基类的对象使用。如果A 是基类,B 和C 是A 的派生类,多态函数Test 的参数是A 的 指针。那么Test 函数可以引用A、B、C 的对象。示例程序如下:
class A { public: void Func1(void); };
void Test(A *a) { a->Func1(); }
class B : public A { … };
class C : public A { … };
// Example
main() { A a; B b; C c; Test(&a); Test(&b); Test(&c); }; |
以上程序看不出“多态”有什么价值,加上虚函数和抽象基类后,“多态”的威力就显示出来了。
C++用关键字virtual 来声明一个函数为虚函数,派生类的虚函数将(override)基类对应的虚函数的功能。示例程序如下:
class A { public: virtual void Func1(void){ cout<< “This is A::Func1 /n”} };
void Test(A *a) { a->Func1(); }
class B : public A { public: virtual void Func1(void){ cout<< “This is B::Func1 /n”} };
class C : public A { public: virtual void Func1(void){ cout<< “This is C::Func1 /n”} };
// Example
main() { A a; B b; C c; Test(&a); // 输出This is A::Func1 Test(&b); // 输出This is B::Func1 Test(&c); // 输出This is C::Func1 }; |
如果基类A 定义如下:
class A { public: virtual void Func1(void)=0; }; |
那么函数Func1 叫作纯虚函数,含有纯虚函数的类叫作抽象基类。抽象基类只管定义纯虚函数的形式,具体的功能由派生类实现。
结合“抽象基类”和“多态”有如下突出优点:
(1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性(这是接口设计的复用,而不是代码实现的复用)。
(2)派生类的功能可以被基类指针引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被将来写的程序调用不足为奇,但是将来写的程序可以被以前写的程序调用那可了不起。 
2/2 首页 上一页 1 2 |