使用虚函数时,有两点要注意:
- 只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。显然,它只能用于类的继承层次结构中。
- 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。
根据什么考虑是否把一个成员函数声明为虚函数呢?主要考虑以下几点:
- 首先看成员函数所在的类是否会作为基类。然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为虚函数。
- 如果成员函数在类被继承后功能不需修改,或派生类用不到该函数,则不要把它声明为虚函数。不要仅仅考虑到要作为基类而把类中的所有成员函数都声明为虚函数。
- 应考虑对成员函数的调用是通过对象名还是通过基类指针或引用去访问,如果是通过基类指针或引用去访问的,则应当声明为虚函数。
- 有时,在定义虚函数时,并不定义其函数体,即函数体是空的。它的作用只是定义了一个虚函数名,具体功能留给派生类去添加。
需要说明的是:使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table,简称vtable),它是一个指针数组,存放每个虚函数的入口地址。系统在进行动态关联时的时间开销是很少的,因此,多态性是高效的。
分享到:
相关推荐
值得注意的是,尽管`Derived`类中的`Say()`被声明为私有成员,但由于它是虚函数,因此可以通过基类指针`Base* ptr`间接访问到它。 #### 实现原理 这里的关键在于虚函数表(vtable)的机制。每个包含虚函数的类都会...
在C++编程语言中,虚函数(Virtual Function)是一个核心特性,它允许子类重写父类的方法,实现多态性。多态性是面向对象编程的三大特性之一,...在实际开发中,应当根据需求权衡虚函数带来的灵活性和潜在的性能影响。
总的来说,C++的设计者在设计语言时,已经考虑到了各种函数类型的特性和应用场景,不允许将某些类型的函数声明为虚函数,是为了保持语言的清晰性和一致性,以及保证程序的正确运行。开发者应当根据具体需求,灵活...
8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9...
8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9...
在性能敏感的代码中,应当谨慎使用虚函数。 3. **虚函数表的布局**:不同的编译器对虚函数表的布局可能会有所不同。理解具体的实现细节对于编写高效的代码是非常有帮助的。 通过以上的介绍,我们可以看出虚函数是...
在基类中,使用`virtual`关键字声明虚函数。例如: ```cpp class Base { public: virtual void func(); }; ``` 3. **纯虚函数**: 如果一个函数只是声明为虚函数,但没有定义,那么这个类就被认为是抽象类。...
在 C++ 中,虚函数和纯虚函数是两种不同的函数声明方式,用于实现多态机制。虚函数可以在基类和子类中都有各自的版本,并且可以通过多态方式调用的时候动态绑定。纯虚函数用来规范派生类的行为,即接口。析构函数...
在C++编程语言中,多态性是面向...在实际编程中,应当根据需求判断何时使用虚函数,特别是在设计需要支持多态行为的基类和派生类时。同时,了解并熟练运用虚析构函数可以避免内存管理中的问题,确保对象的正确销毁。
作者:王姗姗,华清远见嵌入式学院讲师。 通常在实现一个接口的时候使用纯虚函数。接口一般就是一个抽象类。...在这种情况下应当将area函数声明为虚函数。可以在基类point中加一个area函数,并声明为虚
这种行为使得私有虚函数在某些情况下可能被意外调用,因此在设计类时需要特别注意这一点,以避免不期望的外部访问。 问题二:虚函数的默认参数与动态绑定 C++的虚函数支持动态绑定,也就是说,调用哪个版本的虚...
在C++编程语言中,析构函数的作用是在对象...总之,当一个类预期作为其他类的基类,特别是在涉及多态性的情况下,声明其析构函数为虚函数是至关重要的。这不仅能确保资源的正确管理,还能提高代码的健壮性和可维护性。
存虚函数的目的是确保即使基类没有实例,其派生类的对象也可以通过基类指针或引用调用虚函数,实现多态性。例如: ```cpp class AbstractClass { public: virtual ~AbstractClass() {} virtual void someFunction...
- 当一个类是其他类的基类时,它的析构函数应当声明为虚函数。这样做的目的是为了确保在通过基类指针删除派生类对象时,派生类的析构函数能够被正确地调用。 - 如果基类的析构函数不是虚函数,在通过基类指针删除...
在C++中,关键字`virtual`用于声明虚函数。当基类中的某个函数被声明为虚函数时,它就开启了一个“虚函数表”(vtable),其中存储了虚函数的地址。派生类中的同名函数如果要覆盖基类的虚函数,需要在函数声明前加上...
通常在实现一个接口的时候使用纯虚函数。接口一般就是一个抽象类。 有时在基类中将某一成员函数定为虚函数,并不是基类本身...在这种情况下应当将area函数声明为虚函数。可以在基类point中加一个area函数,并声明为虚
而动态关联,又称晚期绑定或动态绑定,是指在运行时才能确定调用哪个函数,这是通过虚函数实现的。 在C++中,多态性是通过虚函数机制来实现的。虚函数允许通过基类指针或引用调用派生类的成员函数,从而实现对不同...
这一条款提醒我们,为了实现正确的多态行为,基类中的成员函数应当声明为虚函数,特别是在有派生类可能重写这些函数的情况下。 总之,这道C++面试题不仅考察了对基本语法的掌握,还深入到了面向对象编程的核心概念...