2

我正在尝试理解继承的概念(用 C++ 进行测试)。这里引用自:http ://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming )

“在面向对象编程 (OOP) 中,继承是一种重用现有对象的代码或从现有对象建立子类型或两者兼而有之的方法,具体取决于编程语言支持”

然后我测试了这段代码:

class Person
{
public:
    int ii;
    Person():ii(0){}
};
class Student : public Person
{
};
class Student1 : public Person
{
};

然后,

Person p;
Student s;
Student1 s1;
s.ii = 222;
p.ii = 333;
cout << s.ii << endl; // prints 222
cout << s1.ii << endl; // prints 0
cout << p.ii << endl; // prints 333

如结果所示,每个子类都有自己的 ii 变量版本,每个子类都从基类获取复制值。因此,当我们更改一个时,它不会影响其他的。

这不是我一开始想到的。我认为从基类继承时,所有子类都会继承相同的属性实例。每个子类不需要保留自己的版本。这可以利用重复使用和节省空间的优势。

我是不是误会了什么?如果我是正确的,那么其他 OOP 语言也是如此吗?(我知道我可以使用静态变量来达到我的想法,但这不是我在说的)

4

2 回答 2

3

您有三个类的实例,因此它们是独立的。这意味着子类不必声明ii. 想想模板之类的类(不要将它们与语言构造模板混淆),然后创建它们的实例。

您不希望所有 Person 始终具有相同的字段值吗?

话虽如此,您可能正在寻找(可能不是/希望不是)静态变量。

在面向对象中查找实例

于 2012-05-06T15:15:13.963 回答
2

您不应将类视为现有实体(至少在 C++ 中),而应将其视为描述类实例行为的模式——即以某种方式创建的单个对象(在 C++ 中——使用显式或隐式构造函数)。

该代码Student s;描述s为 class 的实例Student。类定义中的每个字段都引用实例,而不是类本身。

但是,您可以声明一个静态字段,该字段将在 的所有实例之间共享Student,即使没有创建单个实例:您可以将其视为变量,与实例变量相反。

所以,回到你的问题:子类继承了模式:实例中存在一些字段/方法的事实。然而,这些值对于实例是完全独立的(不包括类(静态)变量)。

C++ 中的继承仅存在于级别,而不存在于实例级别。

于 2012-05-06T15:21:38.907 回答