file-type

掌握虚函数用法:对象引用指针调用实例解析

RAR文件

3星 · 超过75%的资源 | 下载需积分: 4 | 1.63MB | 更新于2025-06-23 | 71 浏览量 | 2 下载量 举报 收藏
download 立即下载
虚函数是面向对象程序设计中的一个核心概念,它允许在派生类中重新定义基类中的函数。这种机制是多态性的一种体现,是面向对象的三大特性之一(封装、继承、多态)。虚函数的关键在于动态绑定,即在运行时根据对象的实际类型来调用相应的函数,而非编译时确定。 在C++中,一个函数被声明为虚函数是通过在函数声明前加上关键字`virtual`来实现的。若要在一个类中声明虚函数,通常意味着这个类可能会被用作其他类的基类,以便其派生类可以重写这个函数,实现多态。 这里我们通过一个名为“对象引用指针调用虚函数实例”的源程序来展示虚函数的用法,目的是帮助初学者理解虚函数以及通过对象引用或指针调用虚函数时如何实现动态绑定。 假设我们有以下的基类和派生类结构: ```cpp class Base { public: virtual void doSomething() { std::cout << "Base class function called." << std::endl; } }; class Derived : public Base { public: void doSomething() override { std::cout << "Derived class function called." << std::endl; } }; ``` 在这个例子中,`Base`类定义了一个虚函数`doSomething`,而`Derived`类则通过使用`override`关键字重写了这个函数。`override`关键字是可选的,但它是良好的编程习惯,因为它可以确保我们确实是想重写基类中的虚函数。 接下来,我们来看一个实例程序: ```cpp #include <iostream> using namespace std; class Base { public: virtual void doSomething() { std::cout << "Base class function called." << std::endl; } }; class Derived : public Base { public: void doSomething() override { std::cout << "Derived class function called." << std::endl; } }; int main() { Base b; Derived d; Base& rb = b; Base& rd = d; rb.doSomething(); // 由于对象b实际是Base类型,调用Base版本的doSomething rd.doSomething(); // 由于引用rd实际指向Base类型的对象,调用Derived版本的doSomething Base* pb = &b; Base* pd = &d; pb->doSomething(); // 由于指针pb实际指向Base类型的对象,调用Base版本的doSomething pd->doSomething(); // 由于指针pd实际指向Derived类型的对象,调用Derived版本的doSomething return 0; } ``` 在上面的程序中,我们创建了`Base`类和`Derived`类的对象以及它们的引用和指针。在主函数中,我们通过这些引用和指针调用`doSomething`函数。 解释如下: 1. `rb.doSomething();` 此处通过基类的引用`rb`调用`doSomething`函数,因为`rb`绑定到的是`Base`类型的对象`b`,因此调用的是`Base`类的版本。 2. `rd.doSomething();` 此处通过基类的引用`rd`调用`doSomething`函数,尽管`rd`声明时是基类的引用类型,但是它实际绑定到`Derived`类型的对象`d`。然而,由于`rd`被声明为`Base`类型的引用,在这个上下文中,编译器会解析为`Base`类的函数。这个调用展示了静态类型绑定,即编译时就确定了调用的是基类版本的函数。要实现多态,我们需要使用指针来调用。 3. `pb->doSomething();` 此处通过基类的指针`pb`调用`doSomething`函数,因为`pb`指向的是`Base`类型的对象`b`,因此调用的是`Base`类的版本。 4. `pd->doSomething();` 此处通过基类的指针`pd`调用`doSomething`函数,因为`pd`指向的是`Derived`类型的对象`d`,因此调用的是`Derived`类重写的版本。这里体现了动态绑定,即运行时根据对象的实际类型来决定调用哪个函数。 在上面的代码示例中,我们看到通过指针调用虚函数时发生了多态。这是因为在编译时编译器只能确定指针是基类类型,但运行时它可以确定指针实际指向的是哪个对象,从而调用正确的函数实现。通过这种方式,我们可以编写出不依赖具体类实现的通用代码,即可以接受基类类型的对象、引用或指针,并正确地调用实际对象类型的成员函数。 在实际的软件开发中,虚函数和对象引用或指针的组合使用是非常常见的,尤其是在创建框架和库时。这使得用户可以根据自己的需要来继承基类,并提供具体的实现,而不必修改框架或库的代码。这样的设计也提高了代码的可扩展性和可维护性。

相关推荐

sf_lsy
  • 粉丝: 18
上传资源 快速赚钱