常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。
1、为什么C++不支持普通函数为虚函数?
普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。
2、为什么C++不支持构造函数为虚函数?
这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)
3、为什么C++不支持内联成员函数为虚函数?
其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)
4、为什么C++不支持静态成员函数为虚函数?
这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。
5、为什么C++不支持友元函数为虚函数?
因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。
*********************************************************************
1、顶层函数:多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层函数不属于成员函数,是不能被继承的。
2、构造函数:(1)构造函数不能被继承,因而不能声明为virtual函数。
(2)构造函数一般是用来初始化对象,只有在一个对象生成之后,才能发挥多态的作用,如果将构造函数声明为virtual函数,则表现为在对象还没有生成的情况下就使用了多态机制,因而是行不通的,如下例:
view plain #include using namespace std;
class B { public:B() {} virtual void show()
{ cout<<"***"<
{ cout<<"==="<
int main(void)
{ B *pb;D d; //先生成对象pb=&d;pb->show(); //再体现多态
pb=new D(); //先调用构造函数pb->show(); //再多态delete pb;return 0;} 3、static函数:不能被继承,只属于该类。
4、友元函数:友元函数不属于类的成员函数,不能被继承。
5、inline函数:inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。此外,一切virtual函数都不可能是inline函数。
分享到:
相关推荐
### 构造函数不能声明为虚函数 构造函数在C++中主要用于初始化对象的状态,确保对象在使用前具有有效的初始值。构造函数不能声明为虚函数的原因主要涉及以下几个方面: 1. **对象类型未知**:当创建一个对象时,...
所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚...
- 如果一个类没有声明任何虚函数,则不会为其生成虚函数表。 - 当一个类继承自另一个含有虚函数的基类时,派生类会拥有自己的虚函数表,并且该表通常会包含基类虚函数表中的函数地址,以及派生类自身定义的虚函数...
### C++虚函数与虚函数表的理解 #### 一、虚函数的概念 在C++中,虚函数(Virtual Function)是一种特殊类型的成员函数,它允许基类指针或引用指向派生类对象,并通过该基类指针或引用调用派生类中重写的同名函数。...
以下是对C++中不可声明为虚函数的几种类型的详细解释: 1. 普通函数(非成员函数): 普通函数不属于任何类,因此无法通过继承关系进行多态调用。它们只能被重载,而不能被覆盖。由于虚函数机制依赖于类的继承,...
这样的基类被称为抽象类,不能被实例化,但可以作为其他类的基类。它的目的是为了定义接口,强制派生类实现这些函数。如果基类中包含纯虚函数,那么任何派生类都必须重写这些纯虚函数,否则它们也将成为抽象类,不能...
普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。 2、为什么C++不支持构造函数为虚函数? 这个原因很简单,主要是从语义上考虑,所以...
虚函数是C++中面向对象编程的一个重要特性,它允许我们通过基类指针或引用调用派生类中的重写方法,实现多态性。本文将深入探讨如何使用C++实现虚函数,包括虚函数的基本用法、虚析构函数的概念以及如何计算类的大小...
- 不声明析构函数为虚函数。 - 指向基类对象的指针释放派生类对象。 - 结果:派生类的析构函数不会被调用,可能导致资源泄漏。 3. **虚析构函数的影响** - 将析构函数声明为虚函数。 - 指向基类对象的指针释放...
3. **虚析构函数**:在C++中,推荐将基类的析构函数声明为虚函数,以确保派生类的析构函数能够被正确调用。 #### 五、示例分析 假设我们有如下类层次结构: ```cpp class CShape { public: virtual void display...
1. **避免内存泄漏**:如前所述,如果不将基类的析构函数声明为虚函数,则通过基类指针删除派生类对象时,只会调用基类的析构函数,派生类的析构函数不会被调用。这可能导致派生类中的资源未被正确释放,引发内存...
### C++ 虚函数表解析 #### 前言 在C++中,虚函数是一种重要的特性,它使得程序能够实现多态性。多态性允许程序员使用基类类型的指针来调用派生类的成员函数。本文将深入探讨虚函数背后的实现机制——虚函数表...
在C++中,抽象类不能被实例化,但可以有派生类,派生类必须实现其父类的所有纯虚函数。 3. 应用:在实验中,`Shape`类被声明为抽象类,其中`area()`,`perim()`和`show()`都是纯虚函数。这强制`Circle`和`Square`这...
本文将探讨为什么构造函数不能被声明为虚函数,并深入分析背后的原因。 #### 二、构造函数的本质 构造函数的主要职责是初始化对象,确保对象在创建时能够处于有效状态。构造函数可以有多种形式:默认构造函数、带...
虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名...
以下是对C++中不能声明为虚函数的五种类型的函数的详细解释: 1. 普通函数(非成员函数): 非成员函数不具备成员函数的特性,不能通过继承链来调用。它们只能被重载,不能被覆盖。因此,将普通函数声明为虚函数...
在C++中,一个类声明了虚函数,编译器就会自动为该类创建一个虚函数表。表中的每个条目都是一个函数指针,对应于类中声明的虚函数。如果类继承自其他类并重写了某个虚函数,那么子类的虚函数表将会包含新的函数指针...
在C++中,虚函数是一个在基类中声明并可以被派生类重写的成员函数。通过使用`virtual`关键字声明,它允许我们使用基类指针或引用调用派生类的版本,而不仅仅是基类的版本。这样就实现了动态绑定(也称为晚期绑定),...
当一个函数被声明为虚函数时,编译器会为该类创建一个虚函数表,其中包含了这个类的所有虚函数地址。这个表在类的每个实例中都存在,并且是在对象构造时初始化的。这样,即使通过基类指针调用虚函数,也能正确地调用...
C++编译器为每个含有虚函数的类创建一个虚函数表(Vtable),存储虚函数的地址。对象内部包含一个指向Vtable的指针,调用虚函数时通过Vtable找到对应的函数地址。 七、final关键字 为了防止派生类进一步重写某个虚...