通过指向const基类的指针调用虚函数
calling virtual function through pointer to const base class
在下面的程序中,基类A中的函数'f'对于派生类B的对象是隐藏的,但是当我通过指向B对象的const A *d调用函数f时,基类中的函数f被调用。如果我删除指针的const说明符(即A *d)函数'f'从派生类被调用。我的问题是这里的常数是如何产生影响的?谢谢你的帮助。
#include <iostream>
class A
{
public:
virtual void f(int n) { std::cout << "A::fn"; }
virtual ~A() { }
void f(int n) const { std::cout << "A::f constn"; }
};
class B
: public A
{
public:
void f(int n) { std::cout << "B::fn"; }
void f(int n) const { std::cout << "B::f constn"; }
};
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: f答::f const
输出(带A* d)B: fB: f
要调用的函数的签名在调用现场根据指针的static类型确定。然后在运行时选择此签名的正确重写。
换句话说,如果你有这个:
const A *d;
d->f(1);
则在const A
中搜索f
。所以它找到了非虚拟的void f(int) const
。
但是,如果你有这个:
A *e;
e->f(1);
则在非const A
中搜索f
。因此,它找到virtual void f(int)
,然后(在运行时)将其委托给最终的覆盖void B::f(int)
。
编辑
这是成员函数选择的规则。当通过const
路径(指针或引用)访问时,只适用const
成员函数。当通过非const路径访问时,会考虑使用非const函数。只有当不存在时,指针(或引用)才隐式地转换为指向const
的指针(或引用),然后才考虑const
成员函数。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 当使用通配符和null指针调用函数时,对输出的说明
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 是否可以使用函数指针调用虚拟析构函数?
- 使用C++指针调用 python 函数
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 从带有参数的基函数指针调用基方法
- 使用唯一指针调用函数会使我的程序崩溃
- C++::在构造函数退出之前通过指针调用成员函数
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 什么时候用指针调用C++类构造函数
- C++ - 使用变量指针调用函数
- 为什么我可以通过野生指针调用成员函数
- 从指针调用方法时出现分段错误
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- C++ abort() 在函数内的抽象类对象指针调用上