0%

C++ 中只能通过引用和指针来实现多态

C++ 中只能通过引用和指针实现多态

多态的正确用法

C++ 中正确的多态使用方法只有两种:

  • 基类引用绑定子类对象
  • 基类指针指向子类对象
1
2
3
4
5
6
7
8
9
10
class Base
{
public:
virtual void Show() { printf("Base Show()\n"); }
};
class Test : public Base
{
public:
virtual void Show() { printf("Test Show()\n"); }
};
1
2
3
4
5
6
7
Test t;
// 引用实现多态
Base& r = t;
r.Show(); // Test Show()
// 指针实现多态
Base* p = &t;
p->Show(); // Test Show()

无法实现多态的错误用法

1
2
Test t;
((Base)t).Show(); // 错误用法, 无法实现多态 输出 Base Show()

不要用基类指针指向子类数组

1
2
Base* p = new Test[10]; // 错误用法!!!!
// 将导致未定义行为, 或者 Segmentation fault

原因其实很简单,当 Base 和 Test 大小不一致的时候,p [1] 其实指向的并不是一个正确的对象起始地址,如果把 p [1] 起始地址当作虚表读取,就会导致内存错乱

虚表指针放在对象起始位置是 C++ 实现多态的核心所在

就像下面的代码,一看就明白

1
2
int* p = new char[8];
// p[1] 指向的并不是数组的第二个元素位置