读书人

一个很高深的有关问题求教(关于虚函

发布时间: 2012-09-08 10:48:07 作者: rapoo

一个很高深的问题,求教(关于虚函数表的)
#include <iostream>
using namespace std;

typedef void (*PFUNC)(void);
typedef PFUNC* PVFTBL;
class A
{
public:
virtual void foo(void)
{
cout << "A::foo()" << endl;

}

virtual void bar(void)
{
cout << "B::bar()" << endl;

}
};

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

}

void bar(void)
{
cout << "B::bar()" << endl;

}
};

int main()
{
A a;
PVFTBL _vftbl = *(PVFTBL*)&a;
cout << _vftbl << endl;
cout << _vftbl+1 << endl;

cout << (void*)_vftbl[0] << endl;
cout << (void*)_vftbl[1] << endl;
(_vftbl[0])();
(_vftbl[1])();


return 0;
}

这是一段访问虚函数表的代码,
我的问题是如果cout << (void*)_vftbl[0] << endl; 改写成为cout << _vftbl[0] << endl时,编译器会报错,接着的一行代码也是一样的问题。
在这里为什么要做强制类型转换?请指教

[解决办法]
cout是超级自动化的输入输出流封装类,它输出什么看的是你给它的数据是什么类型,根据类型调用相应的重载函数
最简单的例子,就是你给它一个char*指针,你看它输出啥

你强制转成void指针,输出的就是指针的值即它指向的地址,这个很容易理解
如果你原样输出,你知道它内部是怎么重载PVFTBL*这个类型的吗?你知道C++标准有任何相关规定吗?
我不知道,而我不写我不知道会有什么结果的代码
[解决办法]
5楼说得非常有道理!
cout是一个ostream标准对象,ostream重载了“<<”操作符,可接收多种类型的参数,其实说白了,也相当于一个函数的多种重载形式;
ostream对于char*的重载实现,是输入char*指向的数组,但是ostream并没有对所有指针类型进行重载,除非你自己写一个全局的重载函数对于你的指针类型进行实现,否则确实会报错,2005以上也许对类型转换做了更智能的处理,所以不会报错。
如果lz想要输出地址,最好还是强制转换为void*;

读书人网 >C++

热点推荐