Cpp虚函数提高(虚函数指针,虚函数表,对象模型)

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值