多态和虚函数

在类的定义中,前面有virtual关键字的成员函数就是虚函数。多态是通过虚函数来实现的。

Class base{

Virtual int get();

};

Int base::get() { }

  • Virtual 关键字只用在类定义里的函数声明中,写函数体时不用。
  • 构造函数和静态成员函数不能是虚函数
  • 虚函数可以参与多态,而普通成员函数不可以。

多态的变现形式之一

  • 派生类的指针可以赋给基类指针
  • 通过基类指针调用基类和派生类中的同名虚函数时:

(1)若该指针指向一个基类的对象,那么被调用是基类的虚函数。

(2)若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数。

这种机制就叫做多态。

多态的表现形式二

  • 派生类的对象可以赋给基类引用
  • 通过基类引用调用基类和派生类中的同名虚函数时:

(1)若该引用引用的是一个基类的对象,那么被调用的是基类的虚函数;

(2)若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数。

这种机制也是多态。

多态的作用

在面向对象的程序设计中使用多态,能够增强程序的可扩充性,即程序需要修改或增加功能的时候,需要改动和增加的代码较少。

多态的常用方法

基类指针数组存放指向各种派生类对象的指针,然后遍历该数组,就能对各个派生类对象做各种操作,是很常用的做法。

在非构造函数,非析构函数的成员函数中调用虚函数是多态。

在构造函数和析构函数中调用虚函数不是多态,编译即可确定,调用的函数是自己的类或基类中定义的函数。

派生类中和基类中虚函数同名同参数表的函数,不加virtual也自动成为虚函数。

测试代码如下:

#include <iostream>
#include <string>

using namespace std;

class A
{
private:
    int val;
public:
    A(int val) :val(val) {};
    virtual void addVal()
    {
        val += 10;
        cout << "A::addVal() is called" << endl;
    }
    void print()
    {
        cout << val << " ";
        cout << "hello world!" << endl;
    }
};

class B :public A
{
private :
    string name;
    int value;
public:
    B(string name, int value, int val) :A(val), name(name), value(value) {};
    virtual void addVal()
    {
        value += 50;
        cout << value << " ";
        cout << "B::addVal() is called" << endl;
    }
    void print()
    {
        cout << name << endl;
    }
    void printHH()
    {
        cout << "HH" << endl;
    }
};

int main()
{
    A a(5); B b("chen", 8, 2);
    b.print();
    A & a1=b;
    a1.addVal();
    A *a2;
    a2 = &b;
    a2->addVal();
    a2->print();//调用的是基类中的print函数。原因是当基类和继承类中的函数名相同时,会优先调用自己类中的成员函数,a2是基类指针,属于基类因此会调用基类的成员函数。b.print()是调用继承类中的成员函数,因为b是继承类。
    return 0;
}
时间: 2024-12-15 10:09:43

多态和虚函数的相关文章

GeekBand-secondweek-c++的多态和虚函数

多态与虚函数 13章的简单继承只是实现了对已有对象的实现的重定义和直接调用,但是向上映射导致的对象切割仍然是个缺陷: 1.延续13章的向上映射 简单继承中,派生类重定义了基类的成员函数,此时,向上映射的结果是很明显的,它使用了基类实现的函数版本,这显然并不是我们想要的效果:为什么会有这样的结果发生,我们先探讨几个问题: 函数调用绑定:函数调用确定目标函数体称为捆绑,编译期绑定称为早绑定,上面的问题就是早绑定引起的,因为编译器只知道基类对象的类型,调用函数也会绑定基类实现的函数版本,要解决这一问题

C++中的多态与虚函数的内部实现

1.什么是多态 多态性可以简单概括为“一个接口,多种方法”. 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可以用自己的方式去响应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数.这是一种泛型技术,即用相同的代码实现不同的动作.这体现了面向对象编程的优越性. 多态分为两种: (1)编译时多态:主要通过函数的重载和运算符的重载来实现. (2)运行时多态:主要通过虚函数来实现. 2.几个相关概念 (1)覆盖.重

C++的多态与虚函数

多态性:对于同一消息,不同的对象由不同的响应方式 多态分为静态多态(编译时多态)和动态多态(运行时多态),动态多态通过虚函数来实现. 覆盖-->子类和父类中有同名同参数列表但是功能不同的函数叫做覆盖,在同一个类中有相同的是重复定义,不是覆盖. 虚函数的使用方法,如下: ①在基类中声明一个函数为虚函数,如: //基类vStudent class vStudent { public: vStudent(int,string); virtual void display();//虚函数,用来实现多态性

PKU C++程序设计实习 学习笔记3 多态与虚函数

第六章 多态与虚函数 6.1 多态和虚函数的基本概念 引言 多态是面向对象程序设计里面非常重要的这个机制.它能很有效的提高程序的可扩充性. 有些程序设计语言有被对象继承的概念,但是没有多态的概念,那这样的程序设计语言只能被称作基于对象的程序设计语言,而不能称为面向对象的语言, 比方说visual basic. 虚函数 在类的定义中,前面有 virtual 关键字的成员函数就是虚函数. class base { <span style="color:#ff0000;">vir

多态实现--虚函数与纯虚函数

多态实现--虚函数与纯虚函数 C++中实现多态是使用虚函数表的方法实现的. 那么具体怎么实现的呢? 举例说明 假设有这样一个多态场景: 有一个基类动物(animal类),动物里面又有两个派生类:猫(cat类)和狗(dog类).现在要求动物类有一个共同的方法:叫声(voice成员函数),但猫和狗叫声是不同的(即:它们的叫声实现方法不同). 那么代码怎么写呢? 多态的代码实现 #include <iostream> using namespace std; //1. 定义一个纯虚函数 class

C++ 多态与虚函数

1.多态的概念 由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应. 先看下面这个简单的例子: #include<iostream> using std::cout; using std::endl; class A { public: void print(){cout << "I am A's print" << endl;} }; class B : public A { public: void print()

多态与虚函数

无论是在编译还是在运行时,c++都支持多态性.编译时的多态是通过重载函数和运算符实现的,而编译时的多态则是通过使用继承和虚函数实现的. 虚函数:是一个成员函数,该函数在基类声明,在派生类中重新定义.再基类中将成员函数声明前加关键字virtual,当继承包含虚函数的类时,派生类将重新定义虚函数. 虚函数实现了“一个接口,多种方法”.

C++多态和虚函数学习笔记

1.从实现的角度看,多态可以划分为两种情况:编译期多态和运行时多态. 前者是在编译过程中,确定同名操作的具体操作对象,从而确定同名函数的具体实现: 后者是在程序运行过程中,动态确定具体的操作对象,从而确定同名函数的具体实现. 这种确定操作具体对象的过程成为联编或联合.联编就是将一个标识符和一个存储地址联系在一起的过程,是计算机程序自身彼此相关联的过程. 从联编进行的不同阶段,可以将联编分为静态联编和动态联编. (1)静态联编是指联编工作在程序编译和连接阶段完成的联编过程.静态联编是程序编译之前进

《C++编程思想》 第十四章 多态和虚函数 (原书代码+习题+讲解)

一.相关知识点 函数调用捆绑 把函数体与函数调用相联系称为捆绑(binding).当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑.我们可能没有听到过这个术语,因为在过程语言中是不会有的:C编译只有一种函数调用,就是早捆绑.上面程序中的问题是早捆绑引起的,因为编译器在只有 instrument地址时它不知道正确的调用函数.解决方法被称为晚捆绑,这意味着捆绑在运行时发生,基于对象的类型.晚捆绑又称为动态捆绑或运行时捆绑.当一个语言实现晚捆绑时,必须有一种机制在运行时确定对象的类型和合适的