小言_互联网的博客

C++类的继承方式探究

252人阅读  评论(0)

一,继承方式简介

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场