c++ - 在 C++ 中用私有(private)函数覆盖公共(public)虚函数

标签 c++ overriding access-control virtual-functions

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

例如:

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

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

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

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

我的具体问题:

  1. 在派生类和基类中对虚拟方法使用不同的权限是否存在任何技术问题?

  2. 这样做有什么正当理由吗?

最佳答案

你确实得到了令人惊讶的结果,如果你有一个 child ,你不能调用 foo,但你可以将它转换为一个基数,然后调用 foo。

child *c = new child();
c->foo; // compile error (can't access private member)
static_cast<base *>(c)->foo(); // this is fine, but still calls the implementation in child

我想您可能可以设计一个不希望公开函数的示例,除非您将其视为基类的实例。但是,这种情况出现的事实表明,在某处可能应该重构一个糟糕的 OO 设计。

关于c++ - 在 C++ 中用私有(private)函数覆盖公共(public)虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484592/

相关文章:

c++ - 'NSFontManager' 没有可见的@interface 声明选择器 'fontpanel:'

swift - 无法将属性声明为开放,因为其类型使用内部类型 (Typealias)

f# - 如何将记录元组解构为私有(private)值

c++ - 如何使用 ASCII 转换使用字符堆栈评估后缀表达式

c++ - 如何在 C++ 中的 Map 中存储 cv::Scalar 对象

c++ - 涉及将 vector 转换为 feed 到 execvp 的错误类型

python - 在 Python 中定义方法别名?

xslt - 覆盖 XSLT 中的命名模板

swift - 使用默认值参数覆盖函数时,如何保持默认值与父类(super class)相同?

regex - Symfony 3 access_control 正则表达式