Sge*_*ne9 6 c++ methods virtual propagation
我只使用C++工作了2~3个月,最近我发现了一个虚函数之后的标识符final.直到今天,我相信虚拟的遗漏将阻止虚拟的传播,但我错了.它含蓄地传播.
我的问题是这个.为什么允许隐式传播?为什么虚拟的存在不能虚拟化而虚拟虚拟使功能不虚拟?在某些情况下是更好的吗?还是它,回到虚拟首次推出的那一天?
据克利福德的答案,甚至有是在由于缺少的警告产生一个编译器的虚拟.
我期望上面的链接回答我的问题,但事实并非如此.
------------加法-------------
有关于询问此功能是否有用的评论.我认为虚函数的最终关键字是使函数虚拟化的东西.该函数不能再被覆盖,因此派生类必须重新声明一个函数,无论它是否具有相同的名称.如果final与devirtualization不同,请帮助我理解它.如果最终没有区别,那么从最终引入的事实来看,虚拟化的有用性是不言而喻的.我同意强制显式虚拟会产生错误,但我很好奇是否有其他原因.
关于特定特征存在(或不存在)的原因的答案通常相当困难,因为它成为猜测和观点的问题.然而,简单的答案可能是最不惊讶的原则.提出一个有意义且可靠且可预测的方案将很困难.
"虚拟化"功能甚至意味着什么?如果在运行时,您在对象上调用"devirtualized"函数,它是否会使用指针的静态类型?如果静态类型具有虚函数但运行时类型没有,那么会发生什么?
#include <iostream>
struct A { virtual void f() const { std::cout << "A"; } };
struct B : A { void f() const { std::cout << "B"; } };
struct C : B { virtual void f() const { std::cout << "C"; } };
struct D : C { void f() const { std::cout << "D"; } };
void f(const A& o) { o.f(); }
int main()
{
// "devirtualized" real C++
f(A{}); // "A" "A"
f(B{}); // "A" or "B"? "B"
f(C{}); // "C"? "C"
f(D{}); // oh god "D"
}
Run Code Online (Sandbox Code Playgroud)
还有一个事实是,对于绝大多数设计,虚拟功能必须在整个层次结构中保持虚拟.要求virtual所有这些都会引入各种很难诊断的错误.C++通常试图远离那些需要纪律才能正确的功能.
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |