C++中。public,private,protected,用哪种继承方式好?
主要差别在于访问权限上的不同。按照public继承的到子类的,不改变基类的访问权限,也就是说基类中public的成员依然是public,protected的依然的protected的,但是private的在子类中是无法访问到的。按照protected继承的类,那么基类的public方法在子类中变成了protected,也就是说,在基类用,类的用户可以调用的public方法到子类中就无法调用了,只有子类和该子类的子类和友元中才能够使用这些方法。其他的同上。按照private继承的类,那么基类所有的public,protected在子类都是private的,只有该子类和其友元能够访问,该子类的子类以及类用户均无法访问了。
protected类型的访问机制与private一样
在基类的派生类中,可以直接访问继承而来的protected成员,但是不能访问private限制的成员.所以在派生类中,可以访问基类继承而来的public和proected两种类型的成员.
在public公有派生下,继承而来的成员访问权限不变.protected派生下,public和protected都变成protected,private派生下,所有的继承下来都是private了
public公有继承
protected保护继承
private私有继承
我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用.
公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类中可直接使用.继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接使用.
保护继承时,基类的private成员仍为有私有.基类的public和protected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员
私有继承时,基类的private成员仍为有私有.基类的public和protected成员将变成派生类的private成员.
举个例子.
class A
{
public:
int m_nTelNum;
protected:
int m_nAge;
private:
int m_nMoney;
};
class B:public A
{
void SetTelNum(int nTelNum)
{
m_nTelNum=nTelNum;
}
void SetAge(int nAge)
{
m_nAge=nAge;
}
void SetMoney(int nMoney)
{
m_nMoney=nMoney;//这里就出现错误,因为基类的private成员不能用.
}
};
B objB;//创建B类的对象objB
objB.m_nTelNum=123456;//可以
objB.m_nAge=30;//错误.public继承中基类的protected在派生类中是protected
objB.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.
class C:protected A
{
void SetTelNum(int nTelNum)
{
m_nTelNum=nTelNum;
}
void SetAge(int nAge)
{
m_nAge=nAge;
}
void SetMoney(int nMoney)
{
m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.
}
};
C objC;//创建C类的对象objC
objC.m_nTelNum=123456;//注意这里和public的区别,这里错误,m_nTelNum变成了C类的protected成员
objC.m_nAge=30;//错误.protected继承中基类的protected在派生类中是protected,这与public同相
objC.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.
class D:private A
{
void SetTelNum(int nTelNum)
{
m_nTelNum=nTelNum;
}
void SetAge(int nAge)
{
m_nAge=nAge;
}
void SetMoney(int nMoney)
{
m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.
}
};
D objD;//创建D类的对象objD
objD.m_nTelNum=123456;//错误,m_nTelNum变成了D类的private成员
objD.m_nAge=30;//错误.private继承中基类的protected在派生类中是private
objD.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.
从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同.现在还看不出public和protected继承的区别
那再看一个例子.
class E:public B
{
void SetTelNum(int nTelNum)
{
m_nTelNum=nTelNum;//可以 因为这是B的公有成员
}
void SetAge(int nAge)
{
m_nAge=nAge;//可以 因为这是B的保护成员,现成变成E的protected成员
}
void SetMoney(int nMoney)
{
m_nMoney=nMoney;//这个肯定不可以!
}
};
E objE;//
objE.m_nTelNum=123456;//可以
//其它的两个就不能用了.
class F:public C
{
void SetTelNum(int nTelNum)
{
m_nTelNum=nTelNum;//可以 因为这是C的保护成员,这里与public继承已经有区别但还没有表现出来
}
void SetAge(int nAge)
{
m_nAge=nAge;//可以 因为这是C的保护成员,现成变成E的protected成员
}
void SetMoney(int nMoney)
{
m_nMoney=nMoney;//这个肯定不可以!
}
};
F objF;
objF.m_nTel=123456;//错误,因为这是F的保护成员.注意与E类区别
class G:public D
{
void SetTelNum(int nTelNum)
{
m_nTelNum=nTelNum;//不可以 因为这是D的private成员,注意这里区别
}
void SetAge(int nAge)
{
m_nAge=nAge;//不可以 因为这是D的private成员,注意区别
}
void SetMoney(int nMoney)
{
m_nMoney=nMoney;//这个肯定不可以!
}
};
//那G在类外就没有了可以引用的继承过来成员了!
//这些继承方式是很难理解的.最好的办法就是多写代码去试.
一个java文件包括多个类文件(不是类中类)
1.一个java文件可以包含多个java类,但是只能包含一个public类,并且public类的类名必须与java文件名相同。2.如果一个java文件只写一个类,所以看类名就知道这个java文件里面的类了。3.一个文件多个类和一个文件一个类的效果是一样的,同样不能访问其它类的private方法。