美文网首页
成员虚函数和基类指针

成员虚函数和基类指针

作者: 四月的记忆 | 来源:发表于2017-05-01 02:48 被阅读0次

对于如下代码:

//Base.cpp
#include<iostream>
using namespace std;
class  Base
{ 
public :      
    Base(char xx)  { x = xx; }
    virtual void who()  
    { 
        cout << "Base class: " << x << "\n" ; 
    }
protected:    
    char x;
} ;
class  First_d : public  Base
{ 
public :       
    First_d(char xx, char yy):Base(xx)  
    { 
        y = yy;
    }
    void who()  
    { 
        cout << "First derived class: "<< x << ", " << y << "\n" ; }
protected:    
    char y;
} ;
class  Second_d : public  First_d
{ 
public :
    Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) 
    { 
        z = zz; 
    } 
    void who()  
    { 
        cout << "Second derived class: "<< x << ", " << y << ", " << z << "\n" ;
    }
protected:    
    char z;
} ;
void main()
{ 
    Base  B_obj( 'A' ) ;   
    First_d F_obj( 'T', 'O' ) ;  
    Second_d S_obj( 'E', 'N', 'D' ) ;
    Base  * p ;
    p = & B_obj ;    p -> who() ;
    p = &F_obj ;     p -> who() ;
    p = &S_obj ;     p -> who() ;
    F_obj.who() ;
    ( ( Second_d * ) p ) -> who() ;
    while(1);
}

我们注意到Base类中的void who()函数添加了关键字virtual
上述代码块运行结果如下:

Base class: A
First derived class: T, O
Second derived class: E, N, D
First derived class: T, O
Second derived class: E, N, D

假如去掉who()前的关键字virtual,运行结果会变为:

Base class: A
Base class: T
Base class: E
First derived class: T, O
Second derived class: E, N, D

发生这样的情况的关键是:virtual关键字使得 随着p指向不同对象,this指针作类型转换执行不同实现版本

温馨提示:

  1. 一个虚函数,在派生类层界面相同的重载函数都保持虚特性
  2. 虚函数必须是类的成员函数
  3. 不能将友员说明为虚函数,但虚函数可以是另一个类的友员
  4. 析构函数可以是虚函数,但构造函数不能是虚函数
  5. 在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、
    参数类型和顺序完全相同
  6. 如果仅仅返回类型不同,C++认为是错误重载
  7. 如果函数原型不同,仅函数名相同,丢失虚特性

相关文章

  • 成员虚函数和基类指针

    对于如下代码: 我们注意到Base类中的void who()函数添加了关键字virtual上述代码块运行结果如下:...

  • 5 - 虚函数指针存放在内存中什么位置

    虚函数 使用基类的引用或指针调用一个虚成员函数时会执行动态绑定基类 派生类 即便形参是基类类型,因为item是引用...

  • 4.1C++多态的概念及前提条件

    借助虚函数,基类指针既 可以使用基类的成员函数,也可以使用派生类的成员函数,它有多种形态,或多种表现方式,这就是多...

  • ★01.基础概念

    抽象类:含有虚函数的类。 抽象基类:含有纯虚函数的类。 虚基类:多重继承中虚继承的基类。 类静态数据成员的定义必须...

  • C++ 虚函数

    C++多态--虚函数virtual及override 如果 不是虚函数,指向子类对象的基类指针只能调用基类的函数,...

  • 类的内存模型 Boolan C++ 第四周

    简单的含虚函数的基类和子类 由于 定义了虚函数,对于基类和子类,在内存的开头都会有一个指向虚函数表的指针,在32位...

  • 警告:deleting object of polymorphi

    原来如果基类里有虚函数,定义了基类指针指向派生类,就会需要定义基类虚析构,这样,基类指针析构的时候,就会先析构派生...

  • C++ - 纯虚函数与抽象类

    纯虚函数:没有函数体的虚函数 抽象类:包含纯虚函数的类只能作为基类来派生新类使用不能创建抽象类的对象抽象类的指针和...

  • 构造语义学

    继承构造函数 类具有可派生性,派生类可以自动的获取基类的成员变量和接口(虚函数和纯虚函数,public派生)。不过...

  • C++ 中的虚函数

    什么是虚函数 在我看来,虚函数是在基类中声明并由派生类重新定义的成员函数(如果不是纯虚函数也可以不覆盖)。当用基类...

网友评论

      本文标题:成员虚函数和基类指针

      本文链接:https://www.haomeiwen.com/subject/twkftxtx.html