关于C++ primer 15章一个习题?

来源:百度知道 编辑:UC知道 时间:2024/06/22 19:16:19
习题15.23
对于下面的基类和派生类定义:
struct Base
{
foo(int);
protected:
int bar;
double foo_bar;
};

struct Derived: public Base
{
foo(string);
bool bar(Base* pb);
void foobar();
protected:
string bar;
};
下面的用法有什么错误?
bool Derived::bar(Base *pb)
{
return foo_bar == pb->foo_bar;
}

我看参考答案说形参改为Derived* 即可?请问对不对,为什么?
还有一个问题,就是“派生类到基类转换的可访问”问题?
如果为protected继承,则后续派生类成员可以转换为基类类型?
谢谢各位赐教!
如果为protected继承,则后续派生类成员可以转换为基类类型, 这句话是什么意思?

形参改为Derived* 即可 -- 正确的。
因为你在函数里面使用Base*指针进行调用的话,由于Base将foo_bar声明成protected,对其他类来说是没有访问权限的。
但使用Derived*的话,则pb->foo_bar访问的是继承下来的foo_bar成员变量,可以访问。

如果为protected继承,则后续派生类成员可以转换为基类类型,即:
Derived cDerived;
Base *pBase = &cDerived;
Base &rbase = cDerived;
这样转换都是正确的。

如果为protected继承,则后续派生类成员可以转换为基类类型?

就是向上转型 可以利用基类对象调用子类方法