其他分享
首页 > 其他分享> > 使用C中的私有函数覆盖公共虚拟函数

使用C中的私有函数覆盖公共虚拟函数

作者:互联网

是否有任何理由使重写的C虚函数的权限与基类不同?这样做有危险吗?

例如:

class base {
    public:
        virtual int foo(double) = 0;
}

class child : public base {
    private:
        virtual int foo(double);
}

C++ faq说这是一个坏主意,但没有说明原因.

我已经在一些代码中看到了这个习惯用法,我相信作者试图让这个类最终,基于一个假设,即不可能覆盖私有成员函数.但是,This article显示了覆盖私有函数的示例.当然another part of the C++ faq建议不要这样做.

我的具体问题:

>在派生类和基类中使用不同的虚拟方法权限是否存在任何技术问题?
>有没有合理的理由这样做?

解决方法:

问题是Base类方法是声明其接口的方式.从本质上讲,它是“你可以对这类对象做的事情.”

在Derived类中,你创建了Base已声明为public private的东西,你正在拿走一些东西.现在,即使Derived对象是“is-a”Base对象,你应该能够对Base类对象做一些你不能对Derived类对象做的事情,打破Liskov Substitution Prinicple

这会在你的程序中引起“技术”问题吗?也许不吧.但它可能意味着您的类的对象不会以用户期望它们的行为方式运行.

如果你发现自己处于你想要的状态(除了在另一个答案中提到的弃用方法),你可能有一个继承模型,其中继承不是真正建模“is-a”(例如,斯科特迈尔斯的例子Square继承自Rectangle,但是你无法改变Square的宽度而不像它的高度那样,你可能需要重新考虑你的阶级关系.

标签:access-control,c,virtual-functions,overriding
来源: https://codeday.me/bug/20190917/1809124.html