如果在将此对象分配给 java 中的基类类型的变量后访问派生类对象的字段,我会得到预期的行为,这意味着打印字段的派生类的值。在c++中打印属于基类的字段值。
在 Java 中,6 按预期打印:
class Ideone
{
static class A {
static int a = 7;
}
static class B extends A {
static int b = 6;
}
public static void main (String[] args) throws java.lang.Exception
{
A a = new B();
System.out.println(((B)a).b);
}
}
在 C++ 中,打印 7:
#include <iostream>
using namespace std;
class Base {
int i = 7;
public:
Base(){
std::cout << "Constructor base" << std::endl;
}
~Base(){
std::cout << "Destructor base" << std::endl;
}
Base& operator=(const Base& a){
std::cout << "Assignment base" << std::endl;
}
};
class Derived : public Base{
public:
int j = 6;
};
int main ( int argc, char **argv ) {
Base b;
Derived p;
cout << p.j << endl;
b = p;
Derived pcasted = static_cast<Derived&>(b);
cout << pcasted.j << endl;
return 0;
}
是否有可能在 C++ 中实现类似类型的行为(打印 6)。
最佳答案
Is it possible to achieve in c++ similar type of behaviour (printing 6).
当然可以,只要您做的事情与您在 Java 中做的一样。
您必须记住,尽管 Java 具有相似的语法,但并不完全相同。在 Java 中,语句 A a = new B();
创建一个基类型的引用,绑定(bind)到派生类型。 ((B)a)
然后将引用的类型向下转换为派生。
在c++中,Base b;
不是引用变量。将派生对象复制分配给此变量将复制派生对象的基础子对象。此语言功能称为切片。只需使用引用即可与您的 Java 代码具有相似的语义:
Base& b = p;
如果您通过 Derived&
引用访问具体类型 Base
的对象,您将调用未定义的行为。
附言你的赋值运算符不返回任何东西,尽管返回类型是非空的。不返回具有未定义的行为。
关于java - 访问派生类对象的字段,C++ vs Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37458019/