继承方式
1、公共继承(public)
2、保护继承(protected)
3、私有继承(private)
注意:父类中的私有成员子类以任意方式继承都不能访问
例:
# include<iostream>
using namespace std;
//父类
class Base
{
public:
int m_a;
protected:
int m_b;
private:
int m_c;
};
//以public方式继承的子类
class Base_son :public Base
{
public:
void func()
{
m_a = 10;//父类中的公共成员 到子类中依然是公共成员
m_b = 10;//父类中的保护成员 到子类中依然是保护成员
}
};
//以protected方式继承的子类
class Base_son1 :protected Base
{
public:
void func()
{
m_a = 100;//父类中公有成员,到子类变为保护成员
m_b = 100;//父类中保护成员,子类依旧是保护成员
}
};
//以private方式继承的子类
class Base_son2 :private Base
{
public:
void func()
{
m_a = 100; //父类中公有,到子类变为私有
m_b = 100; //父类中保护,到子类变为私有
}
};
总结:
以public方式继承:父类的公有成员和保护成员到子类对应也是公有和保护成员
以protected方式继承:父类中的公有和保护成员到子类都为保护成员
以private方式继承:父类中的公有和保护成员到子类都为私有成员
继承的资源
父类中所有非静态的成员都会被子类继承,包括私有成员也会被继承,只是子类无法访问
验证:
# include<iostream>
using namespace std;
class Based
{
public:
int m_a;
protected:
int m_b;
private:
int m_c;
};
class based_son :public Based
{
public:
int m_d;
};
void example()
{
cout<<"sizeof son = "<< sizeof(based_son) << endl;
}
int main()
{
example();
return 0;
}
输出结果:
父类和子类构造和析构顺序
# include<iostream>
using namespace std;
//父类
class Based
{
public:
Based()
{
cout << "Based的构造函数" << endl;
}
~Based()
{
cout << "Based的析构函数" << endl;
}
};
//子类
class Based_son :public Based
{
public:
Based_son ()
{
cout << "Based_son 的构造函数" << endl;
}
~Based_son ()
{
cout << "Based_son 的析构函数" << endl;
}
};
void example()
{
Based_son s1;
}
int main()
{
example();
return 0;
}
输出结果:
可以看见,子类会先调用父类的构造函数,然后再调用自身的构造函数,
然后调用自身析构函数,最后再调用父类的析构函数