C++中三大繼承方式的執行效果
阿新 • • 發佈:2018-12-31
#include <iostream>
using namespace std;
class A
{
public:
void inial(){};
int size;
protected:
int val;
private:
int price;
};
class B : public A
{
public:
int ret(const B b1, A a1)
{
int temp = this->val;
temp = val;
temp = b1.val;
temp = size;
//a1.size;//ok
a1.inial();//ok
//temp = a1.val;//error
//temp = price;//error
}
};
class C : protected A
{
public:
void ret(const C c1, A a1)
{
int temp = this->val;
temp = val;
temp = c1.val;
temp = size;
inial();
a1.inial();
a1.size;
//temp = a1.val;//error
//temp = price;//error
}
};
class D : private A
{
public:
void ret(const D d, A a)
{
int temp = size;//ok
temp = d.val;//ok
temp = val;//ok
inial();//ok
a.inial();//ok
a.size;//ok
//temp = price;//error
//temp = a.val;//error
//temp = price;//error
}
//int tmp = val;//error
};
int main()
{
B b;
b.inial();
b.size;
//b.price;//error
//b.val;//**********error
C c;
//c.size;//error
//c.inial();//error
D d;
//d.inial();//error
//d.size;//error
//d.val;//error
return 0;
}
總結:
對於基類中的private成員,無論採用什麼方式繼承,這些成員只能被基類的成員和友元訪問;
下面的討論只針對基類中的protected和public成員:
1.採用public方式繼承,則基類中的public成員在派生類中成為public成員,派生類物件和派生類
裡面當然可以直接訪問它們;基類中的protected成員在派生類中成為protected成員,但是基類的
protected成員在派生類裡面中只能通過派生類物件訪問,不能通過基類的物件訪問。當然在派生類外
不能通過派生類物件訪問。
2.採用protected方式繼承,則基類的public和protected成員都成為protected成員,此時基類中的
public成員在派生類類外不能通過派生類物件訪問,在派生類類裡按照派生類的protected成員特性訪問;
基類的protected成員在派生類裡面還是隻能通過派生類物件訪問,不能通過基類的物件訪問。當然在
派生類外不能通過派生類物件訪問。
3.採用private方式繼承,則基類中的public和protected成員都成為private成員,此時基類中的
public成員被按照派生類的private成員特性進行訪問;基類的protected成員在派生類裡面還是
只能通過派生類物件訪問,不能通過基類的物件訪問。當然在派生類外不能通過派生類物件訪問。
using namespace std;
class A
{
public:
void inial(){};
int size;
protected:
int val;
private:
int price;
};
class B : public A
{
public:
int ret(const B b1, A a1)
{
int temp = this->val;
temp = val;
temp = b1.val;
temp = size;
//a1.size;//ok
a1.inial();//ok
//temp = price;//error
}
};
class C : protected A
{
public:
void ret(const C c1, A a1)
{
int temp = this->val;
temp = val;
temp = c1.val;
temp = size;
inial();
a1.inial();
a1.size;
//temp = a1.val;//error
//temp = price;//error
};
class D : private A
{
public:
void ret(const D d, A a)
{
int temp = size;//ok
temp = d.val;//ok
temp = val;//ok
inial();//ok
a.inial();//ok
a.size;//ok
//temp = price;//error
//temp = a.val;//error
//temp = price;//error
}
//int tmp = val;//error
};
int main()
{
B b;
b.size;
//b.price;//error
//b.val;//**********error
C c;
//c.size;//error
//c.inial();//error
D d;
//d.inial();//error
//d.size;//error
//d.val;//error
return 0;
}
總結:
對於基類中的private成員,無論採用什麼方式繼承,這些成員只能被基類的成員和友元訪問;
下面的討論只針對基類中的protected和public成員:
1.採用public方式繼承,則基類中的public成員在派生類中成為public成員,派生類物件和派生類
裡面當然可以直接訪問它們;基類中的protected成員在派生類中成為protected成員,但是基類的
protected成員在派生類裡面中只能通過派生類物件訪問,不能通過基類的物件訪問。當然在派生類外
不能通過派生類物件訪問。
2.採用protected方式繼承,則基類的public和protected成員都成為protected成員,此時基類中的
public成員在派生類類外不能通過派生類物件訪問,在派生類類裡按照派生類的protected成員特性訪問;
基類的protected成員在派生類裡面還是隻能通過派生類物件訪問,不能通過基類的物件訪問。當然在
派生類外不能通過派生類物件訪問。
3.採用private方式繼承,則基類中的public和protected成員都成為private成員,此時基類中的
public成員被按照派生類的private成員特性進行訪問;基類的protected成員在派生類裡面還是
只能通過派生類物件訪問,不能通過基類的物件訪問。當然在派生類外不能通過派生類物件訪問。