C++ 中的vptr与vtable

// test.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <cstdlib>
#include <new>
#include <iostream>
using namespace std;


class no_virtual {
	int a;
public:
	void x() const{}
	int i() const {return 1;}
};


class one_virtual {
	int a;
public:
	virtual void x() const {}
	int i() const {return 1;}
};


class two_virtuals{
	int a;
public:
	virtual void x() const {cout<<"hello two_virtuals x()"<<endl;}
	virtual int i() const {cout<<"hello two_virtuals i()"<<endl; return 1;}
};


int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"int: "<<sizeof(int)<<endl;
	cout<<"no_virtual: "
		<<sizeof(no_virtual)<<endl;
	cout<<"void*: "<<sizeof(void*)<<endl;
	cout<<"one_virtual: "
		<<sizeof(one_virtual)<<endl;
	cout<<"two_virtuals: "
		<<sizeof(two_virtuals)<<endl;
	
	two_virtuals two;
	int (*f)();
	long* void_two=reinterpret_cast<long*>(&two);
	long* vpoint=(long*)(void_two[0]);


	int x;
	f=reinterpret_cast<int(*)()>(vpoint[0]);
	x=f();
	f=reinterpret_cast<int(*)()>(vpoint[1]);
	x=f();
	return 0;
}

输出:

int: 4
no_virtual: 4
void*: 4
one_virtual: 8
two_virtuals: 8
hello two_virtuals x()
hello two_virtuals i()

该程序同时能说明,返回值不能确定一个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值