java和c++中的实例变量
Instance variable in java and c++
正如我所理解的,在java中,所有的变量都是引用。
关于下一个代码:
class Parent {
public int x = 12;
}
class Child extend Parent {
public int x = 42;
}
Parent p = new Parent();
System.out.println(p.x);
12
Child c = new Child();
System.out.println(c.x);
42
p = c; // be careful here!
System.out.println(p.x);
12
我认为这里没有Slicing,因为我们谈论的是推荐人。因此,我不明白为什么要打印"12"
。p
现在指向c
的区域,并且c.x
是42。
同样的情况也发生在C++上的下一个代码中:
class Parent {
public:
void example () { cout << "Parent" << endl; }
};
class Child : public Parent {
public:
void example () { cout << "Child" << endl; }
};
Parent * p = new Parent();
p->example()
Parent
Child * c = new Child();
c->example()
Child
p = c; // be careful here!
p->example()
Parent
您隐藏的是成员,而不是覆盖。对于Java示例,不能重写字段。你需要使用一个函数。对于C++示例,Parent
中的函数必须是虚拟的,才能被Child
覆盖。否则,您只需隐藏该函数。
C++:
class Parent {
public:
virtual void example () { cout << "Parent" << endl; }
};
class Child : public Parent {
public:
void example () { cout << "Child" << endl; }
};
在Java中,不能覆盖字段,只能隐藏它。Child有两个字段Parent.x
和Child.x
。引用类型决定了.x
所指的字段
对于java端,您正在声明两个独立的变量
这意味着对于Child c
,存在c.x
和((Parent)c).x
,它们是不同的变量,具有各自的值
这是因为您使用的是p.x,而不是c.x。字段x不会被Child覆盖(例如,方法getX(((。相反,它位于子对象中,对应于子类。因此,实际上有2个:Parent.x和Child.x。
在Java中,只能隐藏字段而不能覆盖它。For Java
p=c
现在p有了c的引用,因此您可以得到答案=12
相关文章:
- 返回 C++ 中的指针实例变量
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- C++ 实例变量初始值设定项中的重复类型
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- C++ 中实例变量的双冒号
- 我可以在没有任何实例变量的情况下使用 decltype 吗?
- OpenMP 私有类实例变量
- C 取消实例变量指针
- 在C++私有区域中初始化实例变量
- 如何将指针存储在实例变量中,该指针被声明为指向基类的指针
- 如何在Arduino中创建另一个类库的实例变量
- 单元测试呼叫实例变量的函数
- 为构造函数初始化引用实例变量提供默认值
- 如何使编译器在实例变量未初始化时C++生成错误或警告
- 如何超载分配运算符,该操作员总计两个实例变量
- C++:通过引用传递或使用私有实例变量
- 对象作为类内的实例变量
- 在不构造实例变量的情况下C++声明实例变量的好方法是什么?
- 实例变量列表中的对象未被保留?指针问题
- Asio完成处理程序中的实例变量无效