#include<iostream>
using namespace std;
class Base
{
public:
void fun_1(){}
protected:
void fun_2(){}
private:
int x_;
};
class Derived :private Base
{
public:
void fun_3()
{
fun_1();//私有繼承過來變爲自己的私有成員,在類內可以訪問
fun_2();
}
protected:
void fun_4();
private:
int y_;
};
class TT:private Derived
{
void fun5()
{
//fun_1();//fun_1已經轉變爲了Derived的私有成員,無論怎麼繼承後面無法訪問。
}
};
class Widget:public Base
{
void fun()
{
//z_=x_;x_是Base的私有成員,即使在類內也無法訪問
fun_2();//fun_2通過兩層繼承還是Widget的protected成員,在類內可以訪問
/*protected和private成員的區別與聯繫:protected和private成員在類外均無法訪問,通過對象只能訪問public成員
在類內自己的protected和private成員均可訪問,那麼區別在哪呢?就是當有繼承產生的時候(不管何種繼承方式),父類的private成員在
子類類內是無法訪問的,但是protected是在子類類內是可以訪問的。
*/
}
private:
int z_;
};
class Person
{
public :
virtual void print()
{
cout<<"Person"<<endl;
}
};
class Student:public Person
{
public:
void print()
{
cout<<"Student"<<endl;
}
};
void MyPrint(Person& p)
{
p.print();
}
int main()
{
//運行時多態練習
Person p;
Student S;
cout<<sizeof(p)<<endl;
cout<<sizeof(S)<<endl;
MyPrint(S);
MyPrint(p);
//繼承練習
Derived d;
d.fun_3();
//d.fun_2();fun_2是Base的protected成員,通過公有繼承過來之後也是protected,通過對象無法訪問
//d.fun_4();fun_4是Derived的protected成員,外部無法訪問
return 0;
}
總而言之:
私有繼承時基類中各成員屬性均變爲private,並且基類中private成員被隱藏。派生類的成員也只能訪問基類中的public/protected成員,
而不能訪問private成員;派生類的對象不能訪問基類中的任何的成員。
保護繼承時基類中各成員屬性均變爲protected,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的public/protected成員,
而不能訪問private成員;派生類的對象不能訪問基類中的任何的成員。