网上有很多资料已经对c++的继承描述得非常清楚了。这里是我学习c++笔记,加深印象。c++一个类里面有public,protected,private属性的成员和方法,类的继承方式也有public,protected这三种方式。当继承方式为public时,基类的成员是什么属性被继承到派生类中就是什么属性,当继承方式为protected时,基类的成员被继承到派生类中,原先是public属性的成员变成了protected属性,protected和private属性的成员保持属性不变,当继承方式为private时,public属性和protected属性的成员都变成private属性。这个都很好理解!(以上说的成员包括方法)
下面来说说类中成员不同属性的访问权限,以public继承方式为例
#ifndef BASE_H_
#define BASE_H_
class Base {
public:
Base();
virtual ~Base();
int fun();
int base;
protected:
int base1;
private:
int base2;
};
#endif /* BASE_H_ */
#include "Base.h"
#include <iostream>
using namespace std;
Base::Base() {
// TODO Auto-generated constructor stub
base = 0;
base1 = 1;
base2 = 2;
}
Base::~Base() {
// TODO Auto-generated destructor stub
}
int Base::fun(){
cout<<"Base::fun"<<endl;
return base2;
}
#ifndef DERIVED_H_
#define DERIVED_H_
#include "Base.h"
class Derived: public Base {
public:
Derived();
virtual ~Derived();
void der();
};
#endif /* DERIVED_H_ */
#include "Derived.h"
#include <iostream>
using namespace std;
Derived::Derived() {
// TODO Auto-generated constructor stub
}
Derived::~Derived() {
// TODO Auto-generated destructor stub
}
void Derived::der(){
base = 5;
cout << "Der base="<<base<<endl;
base1 = 10;
cout << "Der base1="<<base1<<endl;
// base2 = 20; 错误
}
#include "Base.h"
#include "Derived.h"
#include <iostream>
using namespace std;
int main(){
Base b;
cout << "main b base1="<<b.base<<endl;
// cout << "main b base1="<<b.base1<<endl;错误
// cout << "main b base1="<<b.base2<<endl;错误
Derived d;
cout << "main d base1="<<d.base<<endl;
// cout << "main d base1="<<d.base1<<endl;错误
// cout << "main d base1="<<d.base2<<endl;错误
cout << "fun return "<<d.fun()<<endl;
d.der();
}
以上的代码是Derived类继承Base类,大家可以看到public修饰的成员base在哪里都可以访问,而protected修饰的成员base1只能在基类和派生类类中去访问。private只能在自身类中访问。还有一点说明的就是其实private成员是可以被继承到派生类中的,只是不能去访问而已,你们看cout << "fun return "<<d.fun()<<endl;这条语句,fun函数是基类中一个public修饰的方法,里面返回的是一个private修饰的成员,而派生类把基类的fun方法继承了下来,并可以调用,就返回了一个private修饰的base2,如果派生类没有把基类的private成员继承下来,又怎么会有base2呢?不过其实关系不大,因为访问的权限都是一样的,也可以看作没有继承下来。派生类并不能访问基类的private,除非基类留有接口让派生类访问。
最后打印结果
main b base1=0
main d base1=0
Base::fun
fun return 2
Der base=5
Der base1=10