gpt4 book ai didi

java - 访问派生类对象的字段,C++ vs Java

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:38 24 4
gpt4 key购买 nike

如果在将此对象分配给 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com