一,继承方式简介
1,三种继承方式:
公有继承
私有继承
保护继承
2,不同继承方式的影响主要体现在:
(1)派生类成员对基类成员的访问权限
(2)通过派生类对象对基类成员的访问权限
二,公有继承
1,公有继承(public)
(1)继承的派生类访问控制
基类的public和protected成员可以直接访问,但是基类的private成员,不可直接访问。
class A {
public:
int getA() { return a; }
private:
int a;
protected:
int c;
};
class B :public A {
public:
void test1(){
getA();//基类的public成员在派生类中访问属性不变
}
void test2() {
a = 2;//基类的private成员在派生类中不可以访问,编译器报错
}
void test3() {
c = 2;//基类的protected成员在派生类可以访问
}
};
这里强调一下基类的private成员,在派生类中不可直接访问。编译器会报错:
(2)通过派生类的对象:只能访问public成员。
#include<iostream>
using namespace std;
class A {
public:
int testPublic() { cout << "Testing public member" << endl; }
private:
int testPrivate() { cout << "Testing private member" << endl; }
protected:
int testProtected() { cout << "Testing protected member" << endl; }
};
class B :public A {
};
int main()
{
B b;
b.testPublic();
return 0;
}
通过派生类的对象,只能访问基类public成员。其他成员是不可见的,如下图
三,私有继承(private)
(1)派生类中的成员函数访问权限:
可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员;下面设计实验验证:
报错如下:
(2)派生类的对象访问权限:
不能直接访问从基类继承的任何成员。这是因为基类的public和protected成员,被私有继承后,都以private身份出现在派生类中。
实验验证:
四,保护继承(protected)
(1)派生类中的成员函数访问权限:
可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员,这点和public,private一样,但我们还需要实验验证一下:
class A {
public:
int testPublic() { cout << "Testing public member" << endl; }
private:
int testPrivate() { cout << "Testing private member" << endl; }
protected:
int testProtected() { cout << "Testing protected member" << endl; }
};
class B :protected A {
public:
void test1() { testPublic(); }
void test2() { testProtected(); }
void test3() { testPrivate(); }//基类的private成员在派生类中不可以访问,编译器报错
};
基类的私有成员在派生类还是不能访问
(2)通过派生类的对象:
不能直接访问从基类继承的任何成员。这是因为基类的public和protected成员继承后都以protected身份出现在派生类中。而protected成员在类外都是不能调用的。看一个例子:
(3)特点:
对建立其所在类对象的模块来说,它与 private 成员的性质相同。如下图解释:
对于其派生类来说,它与 public 成员的性质相同。见下例:
class A {
protected:
int testProtected() { }
};
class B :public A {
public:
void test() { testProtected(); }//对于其派生类来说,它与 public 成员的性质相同,即可以在类中被访问
};
既实现了数据隐藏,又方便继承,实现代码重用。
五,三者对比总结:
看了这三种继承方式访问属性是不是有点晕?将三者继承方式进行对比总结一下,便于记忆。
1,三者共同点:不论以何种方式继承,派生类中成员函数都可以访问基类中public,protected成员,但是都不可以访问private成员。
2,不同点:除了公有继承方式通过派生类的对象可以访问基类中的pubic成员外(且只能访问public成员),其他继承方式在通过派生类的对象不可以访问基类中任何数据成员。
转载:https://blog.csdn.net/qq_44850917/article/details/102488338