余睿的博客

浮生若梦,别多会少,不如莫遇

0%

c++公有继承的赋值兼容规则

赋值规则

假设有如下的类定义:

1
2
3
4
class Base{};
class Derived:public Base{};
Base b;
Derived d;

我们有如下的赋值兼容规则:

  • 派生类的对象可以赋值给基类的对象
    • b=d;
  • 派生类对象可以初始化基类引用
    • Base& br=d;
  • 派生类对象的地址可以赋值给基类指针
    • Base *p=&d;

如果派生方式为protectedprivate,则上述三条规则不再适用。

直接基类和间接基类

假设类A派生出类B,类B派生出类C,类C派生出类D,······

  • A为类B的直接基类,类B为类C的直接基类
  • A为类C、D的间接基类

在声明一个派生类时,只需要列出它的直接基类即可。

派生类沿着类的层次自动向上继承它的间接基类

派生类的成员包括:

  • 派生类自己定义的成员
  • 直接基类中的所有成员
  • 所有间接基类的全部成员

多层派生实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Base {
public:
Base() {
cout << "Base构造函数被调用!" << endl;
}
~Base() {
cout << "Base析构函数被调用!" << endl;
}
};

class Derived :public Base {
public:
Derived() {
cout << "Derived构造函数被调用!" << endl;
}
~Derived(){
cout << "Derived析构函数被调用!" << endl;
}
};

class MoreDerived :public Derived {
public:
MoreDerived() {
cout << "MoreDerived构造函数被调用!" << endl;
}
~MoreDerived() {
cout << "MoreDerived析构函数被调用!" << endl;
}
};

在上面的实例中,由Base类派生出Derived类,然后由Deriver类派生出MoreDerived

假设初始化一个MoreDerived类对象如下:

1
2
3
4
int main() {
MoreDerived m;
return 0;
}

执行上面的程序,得到如下结果:

1
2
3
4
5
6
Base构造函数被调用!
Derived构造函数被调用!
MoreDerived构造函数被调用!
MoreDerived析构函数被调用!
Derived析构函数被调用!
Base析构函数被调用!

可以看到,在执行构造函时,先执行基类的构造函数,依次最后执行派生类的构造函数。

在执行析构函数时,先执行派生类的构造函数,依次向上最后执行基类的析构函数。

欢迎关注我的其它发布渠道