隐式虚拟传播的原因是什么?

Sge*_*ne9 6 c++ methods virtual propagation

我只使用C++工作了2~3个月,最近我发现了一个虚函数之后的标识符final.直到今天,我相信虚拟的遗漏将阻止虚拟的传播,但我错了.它含蓄地传播.

我的问题是这个.为什么允许隐式传播?为什么虚拟的存在不能虚拟化而虚拟虚拟使功能不虚拟?在某些情况下是更好的吗?还是它,回到虚拟首次推出的那一天?


克利福德的答案,甚至有是在由于缺少的警告产生一个编译器的虚拟.


为什么在c中隐式传播方法的虚拟性

我期望上面的链接回答我的问题,但事实并非如此.

------------加法-------------

有关于询问此功能是否有用的评论.我认为虚函数的最终关键字是使函数虚拟化的东西.该函数不能再被覆盖,因此派生类必须重新声明一个函数,无论它是否具有相同的名称.如果final与devirtualization不同,请帮助我理解它.如果最终没有区别,那么从最终引入的事实来看,虚拟化的有用性是不言而喻的.我同意强制显式虚拟会产生错误,但我很好奇是否有其他原因.

isa*_*nae 8

关于特定特征存在(或不存在)的原因的答案通常相当困难,因为它成为猜测和观点的问题.然而,简单的答案可能是最不惊讶原则.提出一个有意义且可靠且可预测的方案将很困难.

"虚拟化"功能甚至意味着什么?如果在运行时,您在对象上调用"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++通常试图远离那些需要纪律才能正确的功能.