虚拟化的实现也是虚拟的吗?
在C++中实现纯虚函数时,是否有一个最佳实践指南,指出实现也应该是虚拟的?基本原理是什么?虚拟化的实现也是虚拟的吗?
class Interface
{
public:
virtual void foobar() = 0;
};
class Concrete
: public Interface
{
public:
virtual void foobar();
};
没关系。
void foobar()
在Concrete
是virtual
,无论您声明它本身和它覆盖在Interface
的void foobar()
。
虽然如果virtual
关键字出现在派生类与否没关系,我发现它是一个不可或缺的节省时间的自我记录的做法总是包括它,让任何人工作用你的代码从现在开始两年后立刻就能看到,班上的内容比立即见到的内容更多。
我相信这实际上是您可以[可选]告诉编译器在C++ 11中强制执行的规则之一,因此如果您忘记代码将无法编译。 – 2011-06-11 22:38:20
@Dennis:我猜你在考虑**明确的虚拟函数覆盖**:http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides – 2011-06-11 22:51:44
我不知道虚拟功能总是保持虚拟。我今天学到了一些关于C++的知识。 :D – 2011-06-11 21:50:17
不知道。我以为你必须告诉它保持虚拟。真是遗憾,如果知道他有一个'Concrete'对象,它可以从虚函数调用中保存编译器。 – 2011-06-12 00:21:44
如果您通过接口指针调用foobar(),则编译器将被迫进行虚拟函数调用,因为它无法知道对象的实际类型。但是,如果直接对具体对象调用foobar(),编译器可以自由地直接调用函数而不是通过vtable。 – Ferruccio 2011-06-12 13:26:54