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()
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函数,所以就调用了它。
- 2 回答
- 0 关注
- 263 浏览
添加回答
举报