关于virtual虚函数

1.如果父类定义的是普通virtual函数,

(1)父类必须提供一个实现

(2)子类如果不需要实现它,可以不在函数成员中列出来,或者类文件中列出来,不提供实现也可以;子类如果要实现它,则必须在函数成员中列出来

2.如果父类定义的是纯virtual函数

(1)如果子类仍是个抽象类,可以不声明它

(2)如果子类不是抽象类,则必须声明它,因为编译器需要用它来制作虚函数表

3.在子类列表中,函数前加virtual与否都可以,但google代码规范建议加virtual,因为这样可以明白看出它来自于继承.

4.如果想在父类的函数中调用某函数的子类的实现,那么这个函数必须为纯虚函数

 

### C++ 中 `virtual` 虚函数的概念与用法 #### 什么是虚函数? 在 C++ 中,虚函数是一种用于实现 **动态多态** 的机制。通过虚函数,程序能够在运行时根据对象的实际类型调用相应的方法,而不是基于变量的静态类型。这意味着即使使用基类指针或引用访问派生类对象,也能正确调用派生类中重写的函数[^1]。 #### 虚函数定义方式 要定义一个虚函数,需在基类中将某个成员函数声明为 `virtual` 类型。例如: ```cpp class Base { public: virtual void display() { std::cout << "This is the base class." << std::endl; } }; ``` 在此基础上,任何继承自 `Base` 的派生类都可以对该函数进行覆盖(Override)。如果希望强制要求派生类必须实现某一特定行为,则可将其定义为纯虚函数: ```cpp class AbstractClass { public: virtual void mustImplement() = 0; // Pure Virtual Function }; ``` #### 动态绑定的工作原理 当编译器遇到含有虚函数的类时,会在后台创建一张称为 vtable (虚拟表)的数据结构。每个支持虚函数的对象都隐含地持有一个指向此类vtable的指针。这样做的目的是为了确保即便是在复杂继承关系下,仍能快速定位到正确的函数版本[^2]。 #### 使用示例 下面给出一段综合性的代码展示如何运用虚函数达成预期目标: ```cpp #include <iostream> // 定义基类 Shape class Shape { protected: double width, height; public: Shape(double w = 0, double h = 0):width(w),height(h){} // 声明虚函数 area() virtual double area() const{ return 0; } // 析构函数也应设为虚函数以安全释放内存 virtual ~Shape(){} }; // 圆形 Circle 继承自 Shape class Circle : public Shape { private: double radius; public: Circle(double r):radius(r){} // Override 函数 area() double area() const override { return 3.14 * radius * radius; } }; // 矩形 Rectangle 继承自 Shape class Rectangle : public Shape { public: Rectangle(double w,double h):Shape(w,h){} // Override 函数 area() double area() const override { return width * height; } }; int main(){ Shape* shapePtr[] = {new Circle(7), new Rectangle(5,8)}; for(auto ptr:shapePtr){ std::cout << "Area of this figure is:" << ptr->area()<<std::endl; delete ptr; } } ``` 此段代码清晰展现了通过基类指针操作不同类型的具体形状实例,并借助虚函数获取各自面积的过程[^3]。 --- ### 总结 综上所述,C++ 中的虚函数提供了强大的灵活性和扩展能力,使开发者得以构建更加健壮且易于维护的应用程序体系。然而需要注意的是,过度依赖虚函数可能会带来性能开销等问题,因此应当合理权衡利弊加以应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值