C++公有继承

C++公有继承 —— is-a关系

1.怎样继承

class Base{
private:
    ...
public:
    ...
};

class Derived : public Base{
private:
    ...
public:
    ...
}

派生类声明时,加上“ : public 基类名”

2.继承了什么

公有继承,派生类继承了成员和接口
也就是说,派生类对象中,有基类的成员

3.访问权限

派生类不能直接访问基类的私有,但是可以访问基类的公有接口,所以通过基类的公有接口可以间接的访问基类成员

4.没有继承什么

 

I>没有继承构造函数

派生类在声明时,要声明自己的构造函数。

派生类调用自己的构造函数之前,要自动调用基类的构造函数初始化基类成员,可以通过成员初始化列表显式的指明调用哪一个基类构造,缺省情况下调用默认的无参构造。

II>没有继承析构函数

派生类在声明时,要声明自己的析构函数。 派生类调用析构函数之后,自动的调用基类的析构函数。

继承中,构造函数的调用顺序总是和析构函数调用顺序相反

III>没有继承赋值运算符函数

赋值运算符默认调用每个成员的赋值运算符函数(如果是基本类型,直接值传递)。对于派生类对象来说,基类成员的部分调用基类的赋值运算符,派生类成员的部分调用派生类赋值运算符。

再提一句,如果基类中有通过new初始化的成员,则应该重定义基类的复制构造函数和赋值运算符,如果派生类新扩展了需要通过new初始化的成员,那么,派生类定义自己的复制构造函数和赋值运算符函数。对于析构函数,应该将基类的析构函数声明为虚函数

先说复制构造函数,应该通过成员初始化列表显式说明要调用基类地复制构造函数。

Derived::Derived(Derived &obj) : Base(obj) {
    ...
    pointer = new ...;
    ..
}

对于赋值运算符,重定义时,要先调用基类的赋值运算符给基类部分赋值。

Derived &Derived::operator=(const Derived &obj) {
    //首先调用基类的赋值运算符给基类部分赋值
    Base::operator=(obj);
    ...
    pointer = new ...;
    ...
}

对于析构函数,基类应该将析构函数声明为虚函数,如果通过引用或指针操作一个派生类对象,通过基类引用或指针释放内存,如果析构函数不为虚,只会调用派生类的析构函数;析构函数为虚,则通过基类指针可以调用派生类的析构函数,派生类析构函数调用完成后,自动调用基类析构函数

IV>没有继承友元函数

这个好理解,基类友元函数不属于基类,自然不会被继承。

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/89311011
今日推荐