C++中的虚函数与const指针解析

需积分: 50 2 下载量 21 浏览量 更新于2024-09-10 收藏 40KB DOC 举报
"虚函数与const指针" 虚函数是C++中的一个重要特性,它使得多态性成为可能,允许程序在运行时根据对象的实际类型来调用相应的成员函数,而不是在编译期间就确定。这在处理继承层次结构时特别有用,尤其是当你需要通过基类指针或引用操作派生类对象时。 1. **虚函数定义**: 虚函数必须在基类中定义,且只能是非静态成员函数,可以是`protected`或`public`访问权限。定义形式如下: ```cpp virtual 返回值类型 函数名(形参表) {函数体} ``` 2. **虚函数作用**: - 动态联编:虚函数使得程序能够在运行时根据对象的真实类型调用正确的函数版本,即使我们只是通过基类指针或引用来调用。 - 统一接口:派生类可以重写基类的虚函数,保持相同的函数签名,从而提供不同的实现,但接口保持一致。 3. **使用方法**: - 动态绑定:通过基类指针或引用调用虚函数,例如: ```cpp Base* base_ptr = new Derived(); base_ptr->虚函数名(实参表); ``` 或者 ```cpp Base& base_ref = *new Derived(); base_ref.虚函数名(实参表); ``` 4. **其他说明**: - 多态性:虚函数是C++多态的基础,允许我们编写更加通用的代码。 - 纯虚函数:如果基类的某个函数被声明为`virtual void func() = 0`,则它是纯虚函数,使得包含它的类成为抽象类,不能被实例化。 - 构造函数和析构函数:构造函数不能是虚函数,因为它们在对象创建时执行,那时对象的动态类型尚未确定。然而,析构函数可以且通常应当声明为虚函数,以便正确地销毁通过基类指针删除的对象。 5. **不能声明为虚函数的函数**: - 非成员函数不能是虚函数。 - 静态成员函数不能是虚函数,因为它们不与特定对象关联。 - 内联函数不能直接声明为虚函数,但可以在类定义中定义的内联函数可以是虚函数,这可能导致一些误解。"内联函数不能成为虚函数"的表述并不准确,更正的说法应该是"直接在函数声明中声明的内联函数不能是虚函数"。 以下是一个简单的示例,展示了虚函数和非虚函数的区别: ```cpp class Base { public: void f() { cout << "Base" << endl; } // 非虚函数 virtual void vf() { cout << "Basevf" << endl; } // 虚函数 }; class Derived : public Base { public: void f() override { cout << "Derived" << endl; } // 重写非虚函数 void vf() override { cout << "Derivedvf" << endl; } // 重写虚函数 }; int main() { Base* base_ptr = new Derived(); base_ptr->f(); // 调用Base的f() base_ptr->vf(); // 调用Derived的vf() return 0; } ``` 在这个例子中,虽然`Derived`类重写了`Base`的`f()`和`vf()`,但只有`vf()`作为虚函数被正确地动态绑定到`Derived`的版本。`f()`始终调用`Base`的版本,因为它是非虚函数。