继承 虚函数

来源:互联网 发布:免费网页游戏源码 编辑:程序博客网 时间:2024/05/23 12:34

虽然这个方法违反了继承的规则,但是对了解虚函数有好处

子类转换成父类平滑。父类转换成子类就不可以,就像double转换成int。

#include<iostream>
using namespace std;

class A
{
public:
    
void virtual f()
    { cout 
<< "A" << endl; }
}; 

class B:public A
{
public:
    
void f()
    { cout 
<< "B" << endl; }
};

int main()
{
    A 
* pa = new A();
    pa
->f();
    B 
* pb = (B*) pa;//求解释这个会得到什么输出
    pb->f();

    delete pa, pb;
    pa 
= new B();
    pa
->f();
    pb 
= (B*) pa;//求解释这个会得到什么输出
    pb->f();

    
return 0;
}

13没什么说的吧,4的话,看起来有许多未知的样子。
2的话,应该是这样理解吧。

普通成员函数被调用是直接跳转到函数,虚函数是先从类中的一个指针(编译器会帮你做这件事)找到一个虚函数地址列表,然后再按图索骥找到函数。


A对象pa被强制转换为B,也就是把pa的数据空间按照B的规则来重新管理,只是重新管理,数据不会变化。

f()是一个虚函数,在pa的数据空间里,是找不到它的(其他普通成员函数都能在此找到)。这里放的不是f(),而是一个指针,这个指针指向的是一个函数地址列表,在这个地址列表中才存放了f()的地址。

pa是对象A的时候,这个指针指向A的地址列表,pa被强制转换成B,这个指针此时的“含义”会变成B类中指向虚函数的地址列表的指针,但它的数据(所指的函数地址列表)并没有发生变化,因此作为B的pa,也就是(B*)pa,它f()时,调用的仍然是A类的虚拟函数地址列表中的f(),让然会输出A。


0 0
原创粉丝点击