
面向对象中三个特性之一的继承,可能是许多人职责OO的一点,高耦合度,所以大家都推崇组合(也叫内聚)而非继承。继承是子从父页,设计继承是处于消除代码 copy。其实面向对象设计不是让我们把真实世界抽象为对象来表示出来,面向对象思想是我们设计程序,组织代码的方案。
#include <iostream>
class Entity
{
public:
float x, y;
void Move(float xa, float ya)
{
x += xa;
y += ya;
}
};
class Player : public Entity
{
public:
const char *name;
};
int main(int argc, char const *argv[])
{
Player p;
p.Move(5, 5);
std::cin.get();
}
这是 c++ 中继承方式,继承背后究竟发生什么了,现在 player 的实例就具有两种类型 Player 类型和 Entity 类型,在 c++ 中类型是比较复杂的,要想完全理解 c++ 的类型系统还需要话费精力和时间。
class Player : public Entity
其实可以 Player 理解为 Entity 扩展,其实扩展应该别继承更加贴切,Player 也是 Entity 的超集,就像 typescript 是 javascript 超集语言,typescript 拥有所有 javascript 的语言特性。
std::cout << "size of Entity: " << sizeof(Entity) << std::endl;
std::cout << "size of Player: " << sizeof(Player) << std::endl;
size of Entity: 8
size of Player: 16
如果 Player 没有继承 Entity 在大小是由const char *name;
占 4 个字节,再加之拥有 Entity 所占 8 字节就是 12 字节,注意这里const char *name;
是指针所以是 4 字节。
网友评论