【发布时间】:2018-06-08 09:18:21
【问题描述】:
我对面向对象的范式还是有点陌生,因此关于 OOP 的一件事让我感到困惑。这听起来可能是一个天真的问题,答案很明显,而且很可能是一个,但以下两种情况有什么区别:
案例一:
class A
{
public:
A() = default;
A(int i) : data_point(i) {};
virtual int process_data_point();
protected:
int data_point=0;
};
class B : public A
{
public:
int process_data_point() override;
};
案例2:
class A
{
int data_point=0;
public:
A() = default;
A(int i) : data_point(i) {};
int process_data_point();
};
class B
{
public:
A process_data_point_in_a_different_way();
A data_point
};
我的意思是,我知道案例 1 处理的是继承,这符合 OOP 的精神,但我无法摆脱这样一种感觉,即通过使用基类并定义包含数据成员的新类也可以模拟继承基类,具有一些附加功能(如案例 2 中所示)。我知道从长远来看模拟继承可能会变得过于复杂(特别是如果最终从数据成员类中获得一些不需要的功能),但我希望对于一些简单的情况,继承模拟可以正常工作。
有人可以更详细地说明这一点吗?关于仿真的想法本质上是不好的,还是在某些情况下有意义?
【问题讨论】:
-
您说的是 is-a(继承)与 has-a 关系。
-
继承提供了组合不提供的多态性。
-
对于继承,请尝试说“... is a ...”来描述关系。对于封装,请尝试说“......有一个......”来描述这种关系。如果你不能(或类似情况),你应该检查你是如何建模关系的。
-
在这种情况下(A),
virtual触摸带来了另一个方面:它关于一个合约,通过从 A 继承,您同意实现一个process_data_point,它在一个@ 987654325@,保证调用者它必须在那里。 -
考虑用谷歌搜索“继承和封装之间的区别”,很多命中。
标签: c++ oop inheritance