跳转至

11 类 (V) - 继承与抽象类、访问控制

约 498 个字 14 行代码 预计阅读时间 2 分钟

本节录播地址

本节的朋辈辅学录播可以在 B 站 找到!

Warning

本节的文本还没完全写完!可以先去看录播))

Danger

本文未完成,以下仅为学习笔记。

类的布局绝大多数是 implementation-defined 或者 unspecified 的;为数不多被指定了的是,具有相同 access control 的成员会按顺序分配,但每个成员后仍然有可能有实现决定的填充。class.mem.general#19

What if Base b = d; or b = d;?

Default: Base::Base(const Base &); Base& Base::operator=(const Base &);

「Object Slicing」https://stackoverflow.com/questions/274626/what-is-object-slicing

final 类的指针 / 引用做 virtual function call 容易被优化:https://godbolt.org/z/nre68aj4n

虽然 C++ 标准并未规定虚函数的具体实现,但几乎所有的 C++ 编译器都通过虚表 (virtual table) 来

虚拟函数调用 (virtual function call) 的主要性能开销事实上是对流水线预测的破坏;其内存访问和跳转本身并没有很显著的额外开销。虚拟函数调用的成本主要应当与函数本身的时长相比较。

可以通过 final 声明类不能被继承,或者成员函数不能被 override

派生类可以重新定义 ("override") 非 virtual 成员函数,但通常不要这么做。做这样的事情的场景一般是,子类有更多的信息,从而能以更高的效率完成 相同 的工作;但程序员应当保证子类和基类的这一函数的行为是相同的。Ref

通常的编译器实现会将 vtable 放在定义了第一个非 inline virtual 函数被定义的编译单元

受控的是访问权而不是可见性:

int a;
class X {
    int a;
};
class XX : public X {
    void f() { a = 1; }     // which a?
};

派生类的拷贝赋值,参见 Effective C++ 条款 12

class Bar : public Foo {
  // ...

  void printStuff() override {  // help the compiler to check
    Foo::printStuff(); // calls base class' function
  }
};

Back to Basics: Class Layout - Stephen Dewhurst - CppCon 2020

CppCon 2017: Arthur O'Dwyer “dynamic_cast From Scratch”

▲ 显式类型转换

阅读 DnE 14 章、Effective C++ 条款 27

cast operators (C++98) https://stackoverflow.com/questions/103512/why-use-static-castintx-instead-of-intx

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-types

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-silent-bug

讨论单根结构的优缺点

CRTP,参考 https://youtu.be/eD-ceG-oByA?t=1455

颜色主题调整

评论区~

有用的话请给我个赞和 star => GitHub stars
快来跟我聊天~