当前位置: 首页 > 知识库问答 >
问题:

当非常量方法是私有的时,为什么不调用公共常量方法?

华化
2023-03-14
struct A
{
    void foo() const
    {
        std::cout << "const" << std::endl;
    }

    private:

        void foo()
        {
            std::cout << "non - const" << std::endl;
        }
};

int main()
{
    A a;
    a.foo();
}

换句话说,为什么重载解决先于访问控制?这很奇怪。你认为是一致的吗?我的代码工作了,然后我添加了一个方法,我的工作代码根本不编译

共有1个答案

龙兴贤
2023-03-14

当您调用a.foo();时,编译器将通过重载解析来找到要使用的最佳函数。当它构建重载集时

void foo() const

void foo()

现在,由于不是const,所以非const版本是最佳匹配,因此编译器选择void foo()。然后访问限制就到位了,您会得到一个编译器错误,因为void foo()是私有的。

请记住,在过载解决方案中,它不是“找到最佳可用函数”。它是‘找到最好的功能并尝试使用它’。如果由于访问限制或被删除而不能,则会出现编译器错误。

换句话说,为什么重载解决先于访问控制?

好吧,让我们来看看:

struct Base
{
    void foo() { std::cout << "Base\n"; }
};

struct Derived : Base
{
    void foo() { std::cout << "Derived\n"; }
};

struct Foo
{
    void foo(Base * b) { b->foo(); }
private:
    void foo(Derived * d) { d->foo(); }
};

int main()
{
    Derived d;
    Foo f;
    f.foo(&d);
}
 类似资料:
  • 调用常量方法 常量方法是在智能合约中读取值的方法,而不改变智能合约的状态。这些方法与它们生成的智能合约相同的方法签名都是可用的: Type result = contract.someMethod(<param1>, ...).send();

  • 问题内容: 我很好奇,为什么是方法的公开? 此方法从调用它的位置替换原始堆栈跟踪,从而删除了定位异常所需的信息。它可以用于混淆,但无需付出太多努力,因为新的堆栈跟踪将直接指向混淆代码。更好的方法是简单地隐藏异常或抛出新异常。 但是我找不到在现存的上调用此方法的 合理 理由。所以问题是:为什么这种方法是公开的?后面有什么意义吗? 问题答案: 原因之一是性能。抛出和捕获异常很便宜;昂贵的部分是填充堆栈

  • 问题内容: 我看过这样的例子: 并假设我可以有一个Constants类来包装常量,并声明它们为static final。我几乎不了解Java,并且想知道这是否是创建常量的最佳方法。 问题答案: 这是完全可以接受的,甚至可能是标准。 类型是哪里,是所有大写字母的名称,下划线带有空格,并且VALUE是常量值; 我强烈建议不要将常量放在自己的类或接口中。 附带说明:声明为final且可变的变量仍然可以更

  • 问题内容: 我当时正在上课,我想到了几个问题。 我注意到,其他类将使用的公共方法调用了一些私有方法来完成所有工作。现在,我知道OOD的原则之一就是尽可能多地私有化并隐藏所有实现细节。我不确定我是否完全理解其背后的逻辑。 我知道将字段设为私有很重要,以防止将无效值存储在字段中(这只是许多原因之一)。但是,对于私有方法,我不确定为什么它们如此重要。 例如,对于类,我们是否不能将所有实现代码都放入公共方

  • 我们举个例子: 一个常见的解决方案是转移到一个抽象类,但是在我的具体案例中,我有一个枚举的接口,所以在这里不适用。我想这不是被忽略了,就是因为接口背后的原始想法,即它们是可用方法的“契约”,但我想我需要关于这是怎么回事的输入。 我读过“为什么Java 8接口方法中不允许使用”final“?”,其中说: 默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现 与关联问题一样,由

  • 什么是运行时常量池和java中的方法区。我读到JVM创造了这两个,但是哪一个是第一个存在的?还有它们包含什么?任何帮助将不胜感激。