练习15.18 假设给定了第543页和第544页的类,同时已知每个对象的类型如注释所示,判断下面的哪些赋值语句是合法的。解释那些不合法的语句为什么不被允许:
#include <iostream>
#include <string>
using namespace std;
class Base {
public:
void pub_mem();
protected:
int prot_mem;
private:
char priv_men;
};
struct Pub_Derv :public Base {
int f() { return prot_mem; }
};
struct Priv_Derv :private Base {
int f1() { return prot_mem; }
};
struct Prot_Derv :protected Base {
int f2() { return prot_mem; }
};
struct Derived_from_Public :public Pub_Derv {
int use_base() { return prot_mem; }
};
struct Derived_from_Private :public Priv_Derv {
};
struct Derived_from_Protected :public Prot_Derv{
int use_base() { return prot_mem; }
};
int main()
{
Pub_Derv d1;
Base *p = &d1;
Priv_Derv d2;
p = &d2; //访问保护(private)禁止从指向派生类的指针转换成指向基类的指针
Prot_Derv d3;
p = &d3; //访问保护(protected) 禁止从指向派生类的指针转换成指向基类的指针
Derived_from_Public dd1;
Derived_from_Private dd2;
//Derived_from_Protected dd3;
p = &dd1;
p = &dd2; //访问保护(private)
p = &dd3; //访问保护(protected)
}
练习15.19 假设543页和544页的每个类都有如下形式的成员函数:
void menfcn(Base &b) { b = *this; }
对于每个类,分别判断上面的函数函数是否合法。
//非法类,Derived_from_Private不能访问私有基类Priv_Derv
struct Derived_from_Private :public Priv_Derv {
void menfcn(Base &b) { b = *this; }
};