使虚拟的实现也虚拟化? 在C++中实现纯虚函数时,是否有一个最佳实践准则,说明实现也应该是虚拟的?理由是什么 class Interface { public: virtual void foobar() = 0; }; class Concrete : public Interface { public: virtual void foobar(); };

使虚拟的实现也虚拟化? 在C++中实现纯虚函数时,是否有一个最佳实践准则,说明实现也应该是虚拟的?理由是什么 class Interface { public: virtual void foobar() = 0; }; class Concrete : public Interface { public: virtual void foobar(); };,c++,inheritance,virtual,C++,Inheritance,Virtual,没关系 Concrete中的void foobar()是virtual,无论您是否声明它,它都会覆盖接口中的void foobar()中的void foobar(),尽管派生类中是否存在virtual关键字并不重要,我发现总是包含它是一种必不可少的节省时间的自我记录实践,这样从现在起两年后使用代码的任何人都可以立即看到该类的内容比眼前看到的要多。我不知道虚拟函数总是保持虚拟。今天我学到了一些关于C++的知识。我不知道。我想你必须告诉它保持虚拟。遗憾的是,如果编译器知道自己有一个Concrete对

没关系


Concrete
中的
void foobar()
virtual
,无论您是否声明它,它都会覆盖
接口中的
void foobar()

中的
void foobar()
,尽管派生类中是否存在
virtual
关键字并不重要,我发现总是包含它是一种必不可少的节省时间的自我记录实践,这样从现在起两年后使用代码的任何人都可以立即看到该类的内容比眼前看到的要多。

我不知道虚拟函数总是保持虚拟。今天我学到了一些关于C++的知识。我不知道。我想你必须告诉它保持虚拟。遗憾的是,如果编译器知道自己有一个
Concrete
对象,那么它就可以避免虚拟函数调用。如果您通过接口指针调用foobar(),那么编译器将被迫进行虚拟函数调用,因为它无法知道对象的实际类型。但是,如果你直接调用一个具体对象上的FoBoBar(),编译器就可以直接生成函数而不是通过VTABLE调用。@ FrimuIO:只是为了让你的注释更清楚一些——因为一个具体的类可以是C++中的基类,只有当上下文足够完整,编译器才能确定具体实例实际上没有以多态方式使用时,您所描述的才有可能。我相信这实际上是您可以(可选)告诉编译器在C++11中强制执行的规则之一,因此,如果您忘记了您的代码将无法编译。@丹尼斯:我猜您正在考虑显式虚拟函数重写: