C++ 是否有一种方法来标记父项';在不重新实现的情况下,从子类中删除虚拟函数final

C++ 是否有一种方法来标记父项';在不重新实现的情况下,从子类中删除虚拟函数final,c++,c++11,C++,C++11,如果我有密码: struct Parent { virtual void fn(); }; struct Child : public Parent { virtual void fn() override final { Parent::fn(); } }; 有没有一种方法可以让Parent::fn仅在通过Child访问时才成为final,而无需重新实现fn,这样,当从Parent派生时,其他一些类可以覆盖fn,但当从Child派生时不能覆盖

如果我有密码:

struct Parent
{
    virtual void fn();
};

struct Child : public Parent
{
    virtual void fn() override final
    {
        Parent::fn();
    }
};
有没有一种方法可以让
Parent::fn
仅在通过
Child
访问时才成为
final
,而无需重新实现
fn
,这样,当从
Parent
派生时,其他一些
类可以覆盖
fn
,但当从
Child
派生时不能覆盖

比如:


或者其他一些语法?

不,如果不重新实现它,就无法执行。所以只要重新实现它:

struct Child : public Parent
{
    virtual void fn() override final { Parent::fn(); }
};
注意:说虚拟的。。。override final
是完全冗余的,
final
是非虚拟函数上的错误,因此您应该说:

    void fn() final { Parent::fn(); }

@songyuanyao我编辑了这个问题,希望能更清楚vs
{Parent::fn();}
struct Child:public Parent
-
public
在这里是多余的。使用
struct
时,默认情况下继承
public
ly,默认情况下,使用<代码>类< /代码> ES,它是<代码>私有< /代码>。我想把冗余代码<代码>公共代码>放在里面,使它更清晰。我猜想大多数C++程序员都不记得默认继承访问说明符的具体规则,因为我认为,无论是代码>结构> <代码>和<代码>类< /代码>继承。在我检查标准之前,默认代码<>代码>私有/<代码> -LY。不过,我想我有一个C++ C++ 20的建议。有关,你认为重新实现它是为了标记它>代码>最终< /C> >还是只留下基类的实现将有助于编译器更好地优化,可能会允许编译器进行设备化和内联吗?我怀疑人们对这样的建议会感兴趣,你已经可以很容易地做到了。还有很多更重要的事情需要花时间进行标准化。冗余,即重复已经在别处暗示或表达的内容,可以让读者明白一点,或者让读者更清楚、更理解。更严重的是,我不同意关于析构函数的核心准则;如果它们重写,就应该标记为override,只是为了捕捉“oops,parent没有虚拟的”错误。因此,您应该说:
void fn()final{parent::fn();}
“我不同意这一点。我想说,将其标记为虚拟更好,因为它更清楚地说明了意图。
    void fn() final { Parent::fn(); }