LInux C++学习day09 继承(Inheritance) 多态(polymorphic)

一 继承(Inheritance)
8 多重继承
1)概念
一个子类可以同时基类多个基类,这样的继承方式被称为多重继承。

电话 播放器 计算机
\ | /
智能手机

2)多重继承在向上造型时,会根据各个基类子对象 在子类对象中的内存布局,自动进行偏移计算,保证指针的类型和其指向的目标对象类型一致。//参考mul_inherit.png

3)名字冲突问题
–》一个的子类的多个基类如果存在同名的成员,当通过子类访问时,编译器会报歧义错误,即名字冲突。
–》解决名字冲突的通用做法就是显式的加“类名::”,指明所访问的成员属于哪个基类//推荐
–》如果产生冲突的名字是成员函数,并且参数不同,也可以通过using声明,将它们引入到子类作用域,让它们在子类中形成重载,通过重接解析解//不推荐

9 钻石继承和虚继承
1)一个子类的多个基类源自共同的基类祖先,这样的继承关系被称为钻石继承
A
/
B C
\ /
D
A:可以称为公共基类
B、C:可以称为中间类
D:称为末端子类
2)钻石继承时,公共基类(A)子对象在末端子类(D)对象中会存在多份,通过末端子类访问公共基类的成员,会因为继承路径不同导致结果不一致。

3)通过虚继承,可以让公共基类子对象在末端子类对象中只有一份,通过末端子类访问公共基类的成员,即使路径不同所访问到公共基类的成员也一定是一致的。

4)虚继承语法
–》在继承表使用virtual关键字修饰
–》在继承链的末端子类负责构造公共基类子对象
A
/
B C//:virtual public A
\ /
D//末端子类负责构造公共基类子对象

在使用虚继承时,创建D对象,其继承结构会变成如下形式:
B C A
\ | /
D
虚继承原理(了解):参考diamond_virtual.cpp

二 多态(polymorphic)
eg:实现图形库,里面包含各种图形的类
图形基类(位置/绘制)
/
矩形(宽和高/绘制) 圆形(半径/绘制)
1 函数重写(虚函数覆盖)、多态的概念
1)如果将基类中的某个成员函数声明为虚函数,那么其子类中与它具有相同原型的成员函数就也是虚函数,并且对基类版本形成覆盖,即函数重写.
2)满足函数重写的要求后,再通过指向子类对象的基类指针,或者引用子类对象的基类引用,调用虚函数,实际被执行的将是子类中的覆盖版本,而不再是基类中原始版本,这种语法现象被称为多态.
class Base{
public:
virtual void func(void){}//虚函数
};
class Derived:public Base{
void func(void){}//自动变成虚函数
};
Derived d;
Base* pb = &d;//pb指向子类对象的基类指针
Base& rb = d;//rb引用子类对象的基类引用
pb->func();//Derived::func
rb.func();//Derived::func

2 虚函数覆盖的条件(函数重写要求)
1)只有类中的成员函数才能被声明为虚函数,而全局函数、静态成员函数、构造函数不能为虚函数。
注:析构函数可以为虚函数(特殊,后面讲)
2)只有基类中以virtual关键字修饰的函数才能作为虚函数被子类覆盖,而与子类中的virtual无关.
3)虚函数在子类的覆盖版本和在基类中的原始版本必须具有相同的函数签名,即函数名、参数表、常属性一致。
4)如果基类中的虚函数返回基本类型的数据,那么子类中的覆盖版本必须返回相同类型的数据。
5)如果基类中的虚函数返回类类型的指针(A*)或引用(A&),那么允许子类的覆盖版本返回其子类类型的指针(B*)或引用(B&)。
class A{};
class B:public A{};

3 多态的条件
1)多态的语法特性除了要满足虚函数覆盖的条件,还必须通过指针或者通过引用调用虚函数,才能表现出来.
2)调用虚函数的指针也可以是成员函数中的this指针,当通过子类对象调用基类中成员函数,这时该成员函数中的this指针就是指向子类对象的基类指针,再通过它去调用虚函数同样可以表现多态的语法特性//重点掌握

eg:QT中多线程
class QThread{//QT定义好的,描述子线程类
public:
void start(){
run()
}
protected:
//线程入口函数
virtual void run(){

}
};
class MyThread:public QThread{
protected:
//线程入口函数
void run(){
//想要在子线程执行的代码
}
};
MyThread thread;
thread.start();

猜你喜欢

转载自blog.csdn.net/weixin_43789711/article/details/90113565
今日推荐