虚函数的作用

本文通过实例详细介绍了C++中虚函数的概念及其应用场景,特别是如何通过虚函数实现多态,提高代码复用性和扩展性。
 老鸟级的 C++ 编程高手我想都掌握了虚函数的作用(哇,我没说自己是老鸟),但新手我想定是看虚函数一章有点头疼,或看懂了但在实际中用不出来,别急,让我来说上一回。

何为虚函数?虚函数就是被关键字virtaul说明的函数。

举个例子:

这个例子中WindowBWindowC不同时存在,这在实际应用中是常有的情况,为了节省内存。

class WindowA

{

public:

      virtual void Draw(){};

};

 

class WindowB:public WindowA

{

public:

    WindowB(){};

    void Draw();

};

class WindowC:public WindowA

{

public:

   WindowC(){};

   void Draw();

};

 

void WindowB::Draw()

{

画一个圆;

}

void WindowC::Draw()

{

画一个正方形;

}

当在定义WindowA时,不确定它的派生类WindowBWindowCDraw函数中要画什么,这时把Draw定义成虚函数,在派生类中具体实现。

说到这,读者会问:那我把DrawWindowBWindowC中写好,还会少写一个类WindowA

是的,是少写了,如你所说,你会如此使用:

WindowB* b = new WindowB;

b->Draw(); //画个圆

delete b;

WindowC* c = new WindowC;

c->Draw(); //画个正方形

delete c;

我这里用指针实现,在上面的代码中,bc是两个独立的对象的指针。但如果派生类不是一两个,而是几十个,几百个,那你该怎么办呢?在头文件中定义几百个变量?

非也,到时候用虚函数的作用了:

WindowA* a = new WindowsB;

a->Draw();   //画个圆,此处调用了WindowB中的Draw函数实现

ifa

delete a; //new 出来的一定要delete

WindowA* a=new WindowC;

a->Draw(); //画个正方形,此处调用了WindowC中的Draw函数实现

ifa

delete a;

在上面的代码中,a实现了一个中转变量的作用,只要是从WindowA派生的,我都能赋值给a,而bc都是临时变量。再来多少个WindowA的派生类都没问题了,我只要在头文件中定义一个WindowA的指针变量就行了。

 

摘抄:http://goodcandle.cnblogs.com/archive/2005/09/21/241478.aspx

在C++中,虚函数是一种特殊类型的成员函数,主要用于实现多态性,也就是通过基类类型的指针或引用调用派生类对象的成员函数。其作用具体体现在以下几个方面: - **允许派生类重写基类函数**:虚函数允许在派生类中重写基类的函数,从而实现特定于派生类的行为。当使用基类类型的指针或引用调用虚函数时,编译器会在运行时根据实际对象的类型来确定调用的是基类中的函数还是派生类中的函数[^1]。 - **实现动态多态**:虚函数是C++中用于实现动态多态的成员函数。在基类中使用`virtual`关键字声明虚函数后,派生类能够重写(override)该函数。这样一来,当通过基类指针或引用调用此函数时,实际执行的将是派生类中的函数版本。例如以下代码: ```cpp #include <iostream> class Animal { public: virtual void makeSound() { std::cout << "Animal sound!" << std::endl; } }; class Dog : public Animal { public: void makeSound() override { std::cout << "Woof!" << std::endl; } }; int main() { Animal* animal = new Dog(); animal->makeSound(); delete animal; return 0; } ``` 在上述代码中,通过基类`Animal`的指针`animal`指向派生类`Dog`的对象,调用`makeSound()`函数时,实际执行的是`Dog`类中重写后的函数版本,输出“Woof!” [^3]。 - **防止内存泄漏**:当基类可能被继承时,必须将析构函数声明为虚函数,防止内存泄漏。因为如果基类的析构函数不是虚函数,当通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,从而导致派生类对象的部分资源无法正确释放,造成内存泄漏 [^4]。 - **实现代码的灵活性和可扩展性**:可以通过基类类型的指针或引用来访问派生类对象的特定成员函数,而无需知道实际对象的具体类型。这样可以实现代码的灵活性和可扩展性,使得程序可以根据需要动态决定调用哪个函数 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值