虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数!
纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!
虚函数
引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。
class Cman
{
public:
virtual void Eat(){……};
void Move();
};
class CChild : public CMan
{
public:
virtual void Eat(){……};
};
CMan m_man;
CChild m_child;
//这才是使用的精髓,如果不定义基类的指针去使用,没有太大的意义
CMan *p ;
p = &m_man ;
p->Eat(); //始终调用CMan的Eat成员函数,不会调用 CChild 的
p = &m_child;
p->Eat(); //如果子类实现(覆盖)了该方法,则始终调用CChild的Eat函数
//不会调用CMan 的 Eat 方法 ;如果子类没有实现该函数,则调用CMan的Eat函数
p->Move(); //子类中没有该成员函数,所以调用的是基类中的
纯虚函数
//纯虚函数就是基类只定义了函数体,没有实现过程定义方法如下
// virtual void Eat() = 0; 直接=0 不要 在cpp中定义就可以了
//纯虚函数相当于接口,不能直接实例话,需要派生类来实现函数定义
//有的人可能在想,定义这些有什么用啊 ,我觉得很有用
//比如你想描述一些事物的属性给别人,而自己不想去实现,就可以定
//义为纯虚函数。说的再透彻一些。比如盖楼房,你是老板,你给建筑公司
//描述清楚你的楼房的特性,多少层,楼顶要有个花园什么的
//建筑公司就可以按照你的方法去实现了,如果你不说清楚这些,可能建筑
//公司不太了解你需要楼房的特性。用纯需函数就可以很好的分工合作了
虚函数和纯虚函数区别
观点一:
类里声明为虚函数的话,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,这样编译器就可以使用后期绑定来达到多态了
纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。
class A{
protected:
void foo();//普通类函数
virtual void foo1();//虚函数
virtual void foo2() = 0;//纯虚函数
}
观点二:
虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现,这就像Java的接口一样。通常我们把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为你很难预料到父类里面的这个函数不在子类里面不去修改它的实现
观点三:
虚函数的类用于“实作继承”,继承接口的同时也继承了父类的实现。当然我们也可以完成自己的实现。纯虚函数的类用于“介面继承”,主要用于通信协议方面。关注的是接口的统一性,实现由子类完成。一般来说,介面类中只有纯虚函数的。
观点四:
带纯虚函数的类叫虚基类,这种基类不能直接生成对象
,而只有被继承,并重写其虚函数后,才能使用。这样的类也叫抽象类。
虚函数是为了继承接口和默认行为
纯虚函数只是继承接口,行为必须重新定义
分享到:
相关推荐
##### 示例2:单一继承关系下的虚函数表 ```cpp class C1 { public: virtual void F1() {} }; class C2 : public C1 { public: virtual void F2() {} }; ``` 1. **VTable更新**:对于`C2`来说,它的虚函数表不仅...
- 在示例代码中,`Derived` 类继承了三个类,`Base1` 和 `Base2` 都有虚函数,因此 `Derived` 类会有自己的虚函数表,该表中会包含 `Base1` 和 `Base2` 的虚函数,以及 `Derived` 自身的虚函数。 #### 六、小结 ...
2. **虚函数表未初始化**:虚函数机制依赖于虚函数表(vtable)和虚函数指针(vptr)。在对象构造过程中,vtable和vptr的初始化是必不可少的步骤之一。如果构造函数是虚函数,这意味着它需要访问尚未完全初始化的...
C++ 虚函数使用 C++ 虚函数是实现多态机制的主要手段。多态机制允许使用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这是一种泛型技术,旨在使用不变的代码来实现可变的算法。 ...
2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针...
2. 派生类定义:继承自基类,并可能重写基类的虚函数,如: ```cpp class Derived : public Base { public: void func1() override { /*...*/ } void func2() { /*...*/ } void func3() { /*...*/ } // 非虚函数 ...
C++的虚函数和虚函数表是面向对象编程中实现多态性的重要机制。多态性允许通过基类指针或引用调用不同子类的重写方法,从而实现更灵活的设计和代码复用。 虚函数(Virtual Function)是基类中声明的一种特殊函数,...
- 第2个元素:指向虚函数g的指针 - 第3个元素:指向虚函数h的指针 - 第4个元素:虚函数表结束标记 #### 四、示例代码解析 以下是一个具体的例子,展示了如何获取一个类的虚函数表,并从中调用虚函数: ```cpp #...
高质量的C++多态讲解,详细讲解虚函数,虚函数表,虚函数继承,虚函数继承下的内存分配等
虚函数的关键在于虚函数表(vtable),这是一个由编译器自动创建的动态查找表,其中包含了类中所有虚函数的地址。当我们通过基类指针调用虚函数时,实际上是通过这个vtable找到实际的函数地址并执行。 强制类型转换...
### C++ 虚函数表解析 #### 前言 在C++中,虚函数是一种重要的特性,它使得程序能够实现多态性。多态性允许程序员使用基类类型的指针来调用派生类的成员函数。本文将深入探讨虚函数背后的实现机制——虚函数表...
虚函数是面向对象编程中的一个重要概念,特别是在C++语言中被广泛应用。虚函数允许我们实现多态性,这是面向对象设计的关键特性之一。本讲座主要介绍了虚函数的基本概念、使用方式以及它在实际编程中的作用。 虚...
同时,`虚函数`是实现多态性的重要机制,这对于面向对象编程至关重要。然而,有一个重要的概念是:子类对象不能直接调用父类中的虚函数。下面我们将深入探讨这些知识点。 首先,让我们了解`指针`和`引用`。在C++中...
2. 虚函数表的实现机制:虚函数表的实现机制是通过在对象实例的内存中分配一个表,这张表包含了类的虚函数的地址。 3. 虚函数表的结构:虚函数表的结构可以用一个图来表示,其中每个结点对应一个虚函数的地址,并且...
虚函数表是C++实现多态性的重要机制,主要针对含有虚函数的类。多态允许我们使用父类指针调用子类重写的成员函数,实现动态绑定或运行时绑定。虚函数表(Virtual Table,简称V-Table)就是一个存放类中所有虚函数...
2. **虚函数表**:虚函数表是一个数组,包含了所有虚函数的地址。 3. **内存布局**:对于含有虚函数的类,对象的内存布局中,虚函数表指针总是位于首位,接着是其他数据成员。 4. **大小计算**:类的大小取决于其...
虚函数与const指针 虚函数是C++多态的一种表现形式。虚函数是基类的非静态成员函数,其访问权限可以是 protected 或 public。在基类的类定义中定义虚函数的一般形式为:`virtual 函数返回值类型 虚函数名(形参表)...
虚函数是C++中面向对象编程的一个重要特性,它允许我们通过基类指针或引用调用派生类中的重写方法,实现多态性。本文将深入探讨如何使用C++实现虚函数,包括虚函数的基本用法、虚析构函数的概念以及如何计算类的大小...
在没有覆盖父类虚函数的情况下,子类的虚函数表会包含父类的虚函数指针,而子类新增的虚函数则添加到表的后面。如果有覆盖,子类的虚函数表将替换掉相应父类的虚函数指针,确保调用到的是子类的实现。 例如,如果有...
### C++多态性与虚函数知识点解析 #### 一、多态性的概念 多态性是面向对象编程的一个核心特性,它允许我们通过基类的接口来操作派生类的对象。这种特性使得代码更加灵活且易于扩展。在C++中,多态性主要通过虚函数...