1.先来回顾与总结三中访问控制符各自的访问权限:
private, public, protected 访问标号的访问范围:
private:只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.其友元函数访问 3.子类的函数。 但不能被该类的对象访问。
public:可以被1.该类中的函数、2.其友元函数访问 3.子类的函数、也可以由4.该类的对象访问。
注: 友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。
2.继承问题
1)类的继承后属性变化,具体情况如下: private 属性是不能够被继承的(这句话本人觉得有一定问题),protected继承和private继承能降低访问权限。 使用private继承,父类的protected和public属性在子类中变为private;
使用protected继承,父类的protected和public属性在子类中变为protected;
使用public继承,父类中的protected和public属性不发生改变; 如下所示: public: protected: private:
public继承 public protected 不可用
protected继承 protected protected 不可用
private继承 private private 不可用
2)关于继承的困惑
在孙鑫VC++深入详解一书第二章中提到父类的private成员不能被子类继承,而且网上有很多说法也是如此,但我在细读C++程序设计教程第二版(钱能著)一书继承一章中觉得这其实是个错误的理解。父类中的成员能够被子类完全继承,只不过父类的私有成员(被private声明)在子类中不可见而已,那么有人会问既然父类中的成员已经从父类继承到子类,那子类自身岂不就可以访问该私有成员啦?因为无论那种访问权限的成员都能被自身所访问。我们知道这肯定是不对的,
如:
class Base{
int a;
int c;
public:
void print()
{
cout<<''a = "<<a;
cout<<"c = "<<c;
}
Base()
{a = 1;}
};
class Derived:public Base{
int b;
public:
void display()
{
cout<<a; //error 不能访问基类中声明的私有成员
}
};
那么我们如何证明子类中完全继承了基类的私有成员,以及如何访问该私有成员呢?
例:
class Base{
int a;
int c;
public:
void print()
{
cout<<''a = "<<a;
cout<<"c = "<<c;
}
Base()
{
a = 1;
c = 2;
}
};
class Derived:public Base{
int b;
};
int main()
{
Derived d;
d.print();
cout<<"sizeof(d)=" <<sizeof(d);
}
打印出结果:a = 1 c = 2 sizeof(d) = 12
由上面打印结果可知,派生类完全继承了其父类的私有数据,并且访问该私有数据只能通过调用其父类的方法来间接进行访问。
3)关于继承前后父类和子类访问权限的理解
a.对父类中各成员的访问权限依据于其自身的访问控制符。
b.父类中的访问属性以及派生类的继承方式决定了派生类中继承于父类的成员变为了何种访问属性。
如下面的print函数在Base中是public,在Derived中为private:
class Base{
int a;
int c;
public:
void print()
{
cout<<a;
cout<<c;
}
Base()
{a = 1;}
};
class Derived:private Base{
public:
fn()
{
print(); //right
}
};
int main()
{
Derived d;
Base b;
b.print(); //right 还是Base类的共有成员,故能在外部通过对象进行访问
d.print(); //error 因为print被继承之后变成了Derived类的私有成员,故不能再外部通过对象访问
d.fn();
cout<<sizeof(d);
}
这些都是我个人最近两天的一点体会以及心得,都是些C++里相当基础却又非常纠结的一个重要的知识点,欢迎各位有兴趣且还在研究这个问题的朋友一起探讨。可能我还有很多理解不对或错误的地方,希望路过的高手批评指正。