C++C语言

C++学习笔记四

2018-09-24  本文已影响7人  HYIndex

类继承

1. 派生类

派生类构造

使用派生类

派生类与基类的特殊关系

说明: 访问时需要用基类名称和作用域解析符来指定访问的基类的成员(数据或方法), 如果基类成员名称和派生类新添加的成员没有冲突可以直接使用成员名称访问

SubClass subClassObject;
Baseclass* pb = &subClassObject;
Baseclass& rb = subClassObject;

2. 继承

继承方式和关系

多态共有继承

3. 静态联编和动态联编

将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编, 在C++中可以在编译过程完成这种联编, 即静态联编, 又称早期联编(绑定)
由于虚函数和多态的引入, 使用哪一个函数在编译期无法确定, 所以程序在运行时选择正确的虚方法的代码,这种称为动态联编, 又称晚期联编(绑定)

虚函数工作原理

基类对象包含一个指针, 该指针指向基类中所有虚函数的地址表, 派生类对象包含一个指向独立地址表的指针, 如果派生类提供了虚函数的新定义, 该虚函数表将保存新的地址; 如果派生类没有重新定义虚函数, 该vtbl将保存函数原始版本地址; 如果派生类定义了新的虚函数, 则将该函数的地址添加到vtbl中

  • 构造函数不能为虚函数
  • 析构函数应当是虚函数, 除非不作为基类
  • 友元函数不能是虚函数, 因为友元不是类成员, 而只有成员函数才能是虚函数
  • 重新定义将隐藏方法(这不是重载)
class Base {
public:
    virtual void show(int a) const {
        cout << "In base" << endl;
    }
};

class Sub : public Base {
public:
    virtual void show() const {
        cout << "In sub" << endl;
    }
};

int main() {
    Sub s;
    s.show(1); // invalid
    s.show();  // valid
    return 0;
}

4. 抽象基类

一个类包含纯虚函数时, 该类为抽象类, 不能创建抽象类的对象

纯虚函数

virtual void show(int x) = 0;

5. 继承和动态内存分配

派生类不使用new

派生类使用new

hasDMA::operator=(const hasDMA & hs) {
    ...
    baseDMA::operator=(hs);
    ...
}

6. 什么不能被继承

上一篇 下一篇

猜你喜欢

热点阅读