C++中继承方式有三种:public,protected,private。
三种不同的继承方式对父类中成员的访问权限各不相同,生成的派生类对象对父类中声明的成员访问权限也不相同。
public继承:
class A{
public:
int a;
protected:
int b;
private:
int c;
};
class B:public A{
public:
void doAny(){
cout<<a<<endl;
cout<<b<<endl;
}
};
int main(int argc, const char * argv[]) {
B b;
b.a = 4;
return 0;
}
公开继承会将父类中的不同属性的成员都按照原来的属性继承到派生类中,即父类中是public的,派生类中该成员也是public的,父类中是protected的,派生类中该成员中也是protected的。所以对于B类生成的对象来说只能访问a属性,而b,c属性不能直接访问,而在B类中可以直接访问protected的b属性,但是不能访问private的c属性。
private继承:
class A{
public:
int a;
protected:
int b;
private:
int c;
};
class B:private A{
public:
void doAny(){
cout<<a<<endl;
cout<<b<<endl;
}
};
可以发现这份代码和上一份没什么区别,是因为私有继承会将父类中的public和protected的成员都继承为自身的私有属性,所以虽然在B类中还是可以访问a和b,但其实这两个成员已经算是B类的私有成员,大家可以尝试新建一个类去公开继承类B就可以发现。所以第二份代码中没有main函数,因为这时候有B创建的对象已经不能访问a和b。
protected继承:
class A{
public:
int a;
protected:
int b;
private:
int c;
};
class B:protected A{
public:
void doAny(){
cout<<a<<endl;
cout<<b<<endl;
}
};
class C:public B{
public:
void doAny(){
cout<<a<<endl;
cout<<b<<endl;
}
};
大家可以发现这份代码和上一份代码也没有多大区别,但是这份代码中继承自B类的C类中可以访问成员a和b,这是因为保护继承是将父类中的public和protected成员都继承到自己类中作为protected属性,所以子类可以访问,但是对于B类生成的对象来说,还是无法直接protected属性的a和b成员的。
最后引用参考链接的结论:
无论哪种继承方式,父类的公有和保护成员都可以被派生类的成员访问。
无论哪种继承方式,父类的私有成员都不可以被派生类的成员和对象访问。
只有公有继承时,父类的公有成员才可以被派生类的对象访问。
在被继承时,父类的保护成员及和公有成员行为一致。
在被类的对象访问时,保护成员和私有成员的行为一致。