【发布时间】:2020-03-06 11:48:00
【问题描述】:
假设我想要一个类Base 有两种方法:foo(int) 和bar(int)。我希望它们被定义为:
-
Base::foo必须在派生的非抽象类中被覆盖 -
Base::bar不能在派生类中被覆盖
第一个目标可以通过将foo标记为virtual int foo(int) = 0来实现,使其抽象化。第二个要求可以通过将bar标记为virtual int bar(int) final使其成为最终要求来满足。这是生成的代码:
class Base
{
public:
virtual int foo(int n) = 0;
virtual int bar(int n) final
{
return n + 42;
}
};
还有一个派生自Base的示例类:
class Derived : public Base
{
public:
virtual int foo(int n) override
{
return n * n;
}
int bar(int n) // compilation error here
{
return n + 43;
}
};
如我们所愿,试图覆盖 Base::bar 已触发编译错误。
现在,我的问题是:将方法标记为 virtual final 是否会因为函数为 virtual(动态调度)而引入开销,即使该函数无论如何都不能被覆盖?
编辑
不要介意缺少虚拟析构函数~Base(),它不是为了缩短代码。
【问题讨论】:
-
@Evg 已修复
facepalm -
@PeteBecker 但是
Derived可以覆盖它,不是吗? -
隐藏,而不是覆盖。
-
我猜唯一真正的开销是vtable中的函数指针,编译器应该能够优化它
-
"不能在派生类中被覆盖" 那么为什么要使用
virtual呢?如果不是virtual,则不能覆盖它。
标签: c++ inheritance methods overriding virtual-functions