继承
Basepage 基类 News派生类 继承语法 class 基类 :继承模式 父类
继承模式
public : 公有继承 private : 私有继承 protected : 保护继承
子类中会继承父类的私有成员,只不过被编译器隐藏起来
继承中的构造和析构
- 子类对象在创建时会首先调用父类的构造函数
- 父类构造函数执行完毕后,才会调用子类的构造函数
- 当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数
- 析构函数调用顺序和构造函数相反
子类不会继承父类的构造和析构函数 当构造son类的对象时
如果父类中没有合适的构造函数,子类可以使用初始化列表显式的调用父类的其他构造
继承中的同名成员处理
如果子类拥有和父类同名的成员,子类不会覆盖父类的成员 子类有和父类同名的成员函数,子类会将父类中所有同名的版本隐藏掉 如果向调用父类中的版本,必须加作用域
继承中静态成员的处理
静态成员属性继承
静态成员属性,子类可以继承
静态成员函数继承
继承后静态成员函数与普通成员函数相同 静态成员函数可以直接调用,普通成员函数必须创建对象后调用 访问父类中同名的函数:son::base::func();
多继承
我们可以从一个类继承,我们也可以能同时从多个类继承,这就是多继承。但是由于多继承是非常受争议的,从多个类继承可能会导致函数、变量等同名导致较多的歧义。
菱形继承
两个派生类继承同一个基类而又有某个类同时继承者两个派生类,这种继承被称为菱形继承,或者钻石型继承。 ?对于调用二义性,那么可通过指定调用那个基类的方式来解决,那么重复继承怎么解决? 对于这种菱形继承所带来的两个问题,c++为我们提供了一种方式,采用虚基类。那么我们采用虚基类方式将代码修改如下:
class BigBase{
public:
BigBase(){ mParam = 0; }
void func(){ cout << "BigBase::func" << endl; }
public:
int mParam;
};
class Base1 : virtual public BigBase{};
class Base2 : virtual public BigBase{};
class Derived : public Base1, public Base2{};
int main(){
Derived derived;
derived.func();
cout << derived.mParam << endl;
cout << "Derived size:" << sizeof(Derived) << endl;
return EXIT_SUCCESS;
}
以上程序Base1 ,Base2采用虚继承方式继承BigBase,那么BigBase被称为虚基类。 通过虚继承解决了菱形继承所带来的二义性问题。
|