1. 虚函数实现过程
普通的成员函数以及调用
#include <iostream>
using namespace std;
class A{
public:
void say(){
cout<<"A"<<endl;
}
};
class B: public A{
public:
void say(){
cout<<"B"<<endl;
}
};
int main(){
B b;
A &a = b;
A *c = &b;
b.say();
a.say();
}
执行结果B,A,A
声明虚函数,以及重写
class A{
public:
virtual void say(){
cout<<"A"<<endl;
}
};
class B: public A{
public:
void say() override {
cout<<"B"<<endl;
}
};
int main()
{
B b;
A &a = b;
A *c = &b;
b.say();
a.say();
c->say();
}
执行结果B,B,B
2. 虚函数特点:
普通成员函数调用跟着类方法走,虚函数跟着对象方法走。为什么?
我们下面输出类B的大小来看sizeof(B)=8
原因是声明虚函数的对象中,存放着虚函数指针,虚函数指针指向虚函数表的首地址
候捷老师讲义
如何用函数指针的方法,直接找到虚函数调用。
假设函数指针的类型是func类型,虚函数表的首地址的func*类型,虚函数表存储的首地址类型是func**
#include <iostream>
using namespace std;
class A{
public:
virtual void say(){
cout<<"A"<<endl;
}
virtual void func2(){
cout<<"A test 2"<<endl;
}
};
class B: public A{
public:
void say() override {
cout<<"B"<<endl;
}
};
typedef void (*func)();
int main()
{
cout<<sizeof(B)<<endl;
B b;
((func**)(&b))[0][0]();
A &a = b;
A *c = &b;
b.say();
a.say();
c->say();
}