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

#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()

缥缈止盈
浏览 228回答 2
2回答

千巷猫影

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()

ITMISS

首先,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函数,所以就调用了它。
打开App,查看更多内容
随时随地看视频慕课网APP