gpt4 book ai didi

c++ - 通过指向 const 基类的指针调用虚函数

转载 作者:太空狗 更新时间:2023-10-29 21:01:54 25 4
gpt4 key购买 nike

在下面的程序中,基类 A 中的函数 'f' 对于派生类 B 的对象是隐藏的。但是当我通过指向 B 的对象的 const A *d 调用函数 f 时,函数 f 来自正在调用基类。如果我从派生类中删除指针(即 *d)的 const 说明符,则调用函数“f”。我想知道 constness 在这里有何不同?感谢您的帮助。

#include <iostream>

class A
{
public:
virtual void f(int n) { std::cout << "A::f\n"; }
virtual ~A() { }

void f(int n) const { std::cout << "A::f const\n"; }
};

class B
: public A
{
public:
void f(int n) { std::cout << "B::f\n"; }

void f(int n) const { std::cout << "B::f const\n"; }
};

int main()
{
const A a;
B b;
A &c = b;
const A *d = &b;

c.f(1);
d->f(1);


return 0;
}

输出(使用 const A *d):B::fA::f 常量

输出(A* d)B::fB::f

最佳答案

要调用的函数的签名在调用点根据指针的静态 类型确定。然后在运行时选择此签名的正确覆盖程序。

换句话说,如果你有这个:

const A *d;
d->f(1);

然后在 const A 中搜索 f。所以它找到了非虚拟 void f(int) const

但是,如果你有这个:

A *e;
e->f(1);

然后在非常量 A 中搜索 f。因此它会找到 virtual void f(int),然后(在运行时)将其委托(delegate)给最终的覆盖程序 void B::f(int)

编辑

这遵循成员函数选择的规则。当通过 const 路径(指针或引用)访问时,只有 const 成员函数适用。通过非常量路径访问时,会考虑非常量函数。只有在没有指针(或引用)时,才会将指针(或引用)隐式转换为指向 const 的指针(或引用),然后考虑 const 成员函数。

关于c++ - 通过指向 const 基类的指针调用虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854668/

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