为了账号安全,请及时绑定邮箱和手机立即绑定

以下内容是关于在C++中const 用法求解,求助~

以下内容是关于在C++中const 用法求解,求助~

C++
缥缈止盈 2021-11-25 21:15:20
#include"iostream"using namespace std;class A{public:virtual void f(){cout<<"A::f()"<<endl;}void f()const{cout<<"A::f() const"<<endl;}};class B: public A{public:void f(){cout<<"B::f()"<<endl;}void f()const{cout<<"B::f() const"<<endl;}};void g(const A* a){a->f();} int main(){A* a=new B();a->f();g(a);delete a;system("pause");return 0;}求解 g(a)输出为什么是A::f() const当将函数g(const A*a)中const 去掉是输出结果为B::f()
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

g(const A*a)时,传入的是B类对象指针,B类继承A类void f()const,a只能访问B继承的A的部分。
const修饰的对象只能调用const成员函数,a->f();输出A::f() const
而去掉const后,A类指针被子类初始化,a->f(),根据虚函数带来的多态性,具体调用哪个函数由运行时确定,发现this指向B类,所以输出B::f()

查看完整回答
反对 回复 2021-11-29
?
ITMISS

TA贡献1871条经验 获得超8个赞

首先,a是一个指向B类对象的指针。

其次,
void f()const{
cout<<"A::f() const"<<endl;
}
的const是函数的“特征标”之一,所以,这个f函数和另一个f函数构成重载。

最后,常对象(或者是指向常对象的指针),将会调用const函数,如果没有const函数只有非const函数,将报错;非常对象(即没有被const修饰的普通对象)则会优先调用非const函数,如果没有非const函数只有const函数,将会调用const函数。

然后是分析:

求解 g(a)输出为什么是A::f() const
答:因为g函数接收到参数后,给它加了个const修饰,所以,g函数内的a是一个指向常对象的指针。void f()const这个函数不是虚函数,所以它被B类直接继承了,意思是说,B类其实是有一个
void f()const{
cout<<"A::f() const"<<endl;
}
这样的函数的。然后,g内的a->f();调用的就是B类(因为a是一个指向B类对象的指针)里的void f()const函数。

当将函数g(const A*a)中const 去掉是输出结果为B::f()
答:去掉const之后,g函数里的a只是一个指向非常对象(即没有被const修饰的普通对象)的指针,将会优先调用非const函数,B中刚好有一个重写了A类那个没有const的f函数的f函数,所以就调用了它。



查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 263 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信