gpt4 book ai didi

c++ - 我的方法调用是如何解决的?

转载 作者:行者123 更新时间:2023-11-30 00:56:39 25 4
gpt4 key购买 nike

明确说明以下情况下的方法解析规则是什么。我有一个想法,基于代码的行为,但想要澄清。

基于“调用对象的常量特性决定了将调用哪个版本的 MyArray::Get(),从而决定了调用者是否被给予一个他可以操作或仅观察私有(private)数据的引用对象。这两种方法在技术上具有不同的签名,因为它们的“this”指针具有不同的类型,允许编译器从 wikipedia const correctness 中选择正确的方法。 ,我会得出结论,我的示例应该是方法重载的情况,不是方法覆盖(因为 const 方法和非 const 方法有两个不同的签名)。

class Base
{
public:

void test()
{ std::cout << "nonconst call" << std::endl; }
};

class Child : public Base
{
public:

void test() const
{
std::cout << "const call" << std::endl;
Child * nonConstThis = const_cast<Child * >(this);
Base * nonConstBase = dynamic_cast<Base * >(nonConstThis);

// This call leads to infinite recursion by calling
// "void Child::test() const", which implies that
// a "Child *" will resolve to calling a const Child function
// before calling a non-const Base function.
//nonConstThis->test();

// This will call "void Base::test()"
nonConstBase->test();
}

};

void main()
{
Child * child = new Child;
child->test();
}

最佳答案

其实是方法隐藏,不是重载。

当您在派生类中创建同名方法时,基类版本将不再可见。

struct A
{
void foo() {}
};

struct B : public A
{
void foo(int x) {}
};

B b;
b.foo(); //error

我假设您期望 B::foo() 存在,但是,如您所见,它并不存在。所以没有什么,不是 cv 限定符(const)或参数影响这个。

在你的例子中,名称没有被解析,因为它与 const 有关,但因为你正在调用 test 类型的对象 child 。然后,您可以在类型为 Base 的对象上调用 Base::test(),就像下面的示例一样:

((A)b).foo();

关于c++ - 我的方法调用是如何解决的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9674258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com