c++中虚函数和多态性

  1.直接看下列代码:

#include <iostream>
using namespace std;
class base{
public:
    void who(){
        cout<<"this is the class of base!"<<endl;
    }
};
class derivel1:public base{
public:
    void who(){                  //一般的重载函数
        cout<<"this is the class of derivel1!"<<endl;
    }

};
class derivel2:public base{
public:
        void who(){
        cout<<"this is the class of derivel2!"<<endl;
    }

};
int main(){
    base obj1,*p;
    derivel1 obj2;
    derivel2 obj3;
    p=&obj1;
    p->who();
    p=&obj2;
    p->who();
    ((derivel1*)p)->who();
    p=&obj3;
    p->who();
    ((derivel2*)p)->who();
    obj2.who();
    obj3.who();

    return 0;
}

这就引入了为什么要引入虚函数的概念——————为了实现多态性

2.对于虚函数在内存中的分布,看一下博客即可深刻体会:

http://blog.csdn.net/zhangliang_218/article/details/5544802

ps:注意虚函数和重载函数的关系

ps:注意与java多态的区别

3.在构造函数和析构函数中调用虚函数

编译系统对构造函数和析构函数中调用虚函数采用静态联编,即它们所调用的虚函数是自己的类或者基类中定义的函数而不是在任何派生类中重定义的函数。

  例子如下:

#include <iostream>
using namespace std;
class base{
public:
    base(){
    }
    virtual void vf(){
        cout<<"base::vf() called"<<endl;
    }
};
class son:public base{
public:
    son(){
        vf();
    }
    void g(){
        vf();
    }
};
class grandson:public son{
public:
    grandson(){

    }
    void vf(){
        cout<<"grandson::vf() called\n";
    }
};
int main(){
    grandson gs;
    gs.g();
    return 0;
}

结果如下:

程序出现这样的运行结果是因为在建立grandson类的对象gs时,它所包含的基类子对象在派生类中定义的新成员建立之前就被建立。

4.空的虚函数

  派生类并不一定必须实现基类中的虚函数,如果派生类想通过虚函数机制访问虚函数,则必须建立一条从基类到派生类的虚函数路径。

#include <iostream>
using namespace std;
class base{
public:
    virtual void print(){
        cout<<"class base\n";
    }
};
class son:public base{
public:
    virtual void print(){   //空虚函数
    }
};
class grandson:public son{
public:
    virtual void print(){
        cout<<"class grandson!\n";
    }
};
void show(base *p){
    p->print();
}
int main(){
    base *pbase=new base;
    son *pson=new son;
    grandson *pgrandson=new grandson;
    show(pbase);
    show(pson);
    show(pgrandson);

    return 0;
}

  运行结果:

5.纯虚函数和抽象类

时间: 2024-07-30 13:53:09

c++中虚函数和多态性的相关文章

&lt;转&gt;C++继承中虚函数的使用

转自:http://blog.csdn.net/itolfn/article/details/7412364 一:继承中的指针问题. 1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承 而来的那些成员,不能访问子类特有的元素 ,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;D  dd; p=&dd;是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不 知道派生类中的这些成员. 2. 不能使派生类

关于C++与Java中虚函数问题的读书笔记

之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的代码,输入结果竟是Base,这让一直以来用C/C++的我有些莫不着头脑,不是Java里对象是引用吗?C/C++中通过指向基类的指针或引用来指向派生类,那么对于虚函数来说通过基类指针使用的是指向的派生类.但在Java中没有keyword标明虚函数,此时就不是非常明确究竟调用的谁. class base

C++中虚函数的动态绑定和多态性

目录 静态类型VS动态类型,静态绑定VS动态绑定两组概念 虚函数的实现机制 多态性 一.静态 vs 动态 静态类型 VS 动态类型.静态类型指的是对象声明的类型,在编译器确定的.动态类型指的是对象的所指向的类型,动态类型是可以更改的,静态类型无法更改.继承关系会导致对象的指针和引用具有静态类型和动态类型,因为继承关系的存在中可能会存在类型之间的向上向下类型转换.静态绑定 VS 动态绑定.某特性(函数)依赖与对象的静态类型,在编译期确定,某特性(函数)依赖于对象的动态类型,在运行期确定.只有通过基

c++中虚函数和纯虚函数定义

只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数. 根据什么考虑是否把一个成员函数声明为虚函数? ①  看成员函数所在的类是否会作为基类 ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该

C++中虚函数和纯虚函数的作用与区别-详解

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void Move(); private: }; class CChild : public CMan { public: virtual void

C++虚函数与多态性

多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.多态(polymorphism),字面意思多种形状. 虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override). 包含纯虚函数的类称为抽象类.由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象. C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实

C++中虚函数的理解,以及简单继承情况下的虚函数的表!

面向对象的三大特征=封装性+继承性+多态性 封装=将客观事物抽象成类,每个类对自身的数据和方法实行权限的控制 继承=实现继承+可视继承+接口继承 多态=将父类对象设置成为和一个或者更多它的子对象相等的技术, 用子类对象给父类对象赋值之后, 父类对象就可以根据当前赋值给它的子对象的特性一不同的方式运作 C++的空类有哪些成员函数 1.缺省构造函数 2.缺省拷贝构造函数 3.缺省析构函数 4.缺省赋值运算符 5.缺省取址运算符 6.缺省取址运算符const PS:只有当实际使用的时候才会去使用这些类

C++中虚函数的作用是什么?它应该怎么用呢?

虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 class A{

C++中虚函数工作原理和(虚)继承类…

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式.vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl.当