我们都知道C++中的虚拟函数是什么,但是它们是如何在深层次上实现的呢?
vtable可以在运行时修改甚至直接访问吗?
vtable是适用于所有类,还是只适用于那些至少有一个虚函数的类?
抽象类是否只对至少一个条目的函数指针有NULL?
只有一个虚函数会减慢整个类的运行速度吗?还是只调用虚拟的函数?如果虚拟函数实际上被重写了,速度是否会受到影响,或者只要它是虚拟的,这就没有影响吗?
发布于 2008-09-19 14:41:32
您可以在C++中重新创建虚函数的功能,使用函数指针作为类的成员,使用静态函数作为实现,或者使用指向成员函数和成员函数的指针来实现。这两种方法之间只有象征性的优点。事实上,虚函数调用本身只是一种符号上的便利。事实上,继承只是一种符号上的便利。它们都可以在不使用语言特性进行继承的情况下实现。:)
下面是未经测试的垃圾代码,可能是错误代码,但希望能演示这个想法。
例如:
class Foo
{
protected:
void(*)(Foo*) MyFunc;
public:
Foo() { MyFunc = 0; }
void ReplciatedVirtualFunctionCall()
{
MyFunc(*this);
}
...
};
class Bar : public Foo
{
private:
static void impl1(Foo* f)
{
...
}
public:
Bar() { MyFunc = impl1; }
...
};
class Baz : public Foo
{
private:
static void impl2(Foo* f)
{
...
}
public:
Baz() { MyFunc = impl2; }
...
};https://stackoverflow.com/questions/99297
复制相似问题