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

标签 java c++ inheritance

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

相关文章:

java - 从 java beans 选择下拉菜单填充表单字段

java - 覆盖 Protocol Buffer 在将字段设置为 null 时抛出 NPE 的默认行为

Java/Android HttpURLConnection setChunkedStreamingMode 不适用于所有 PHP 服务器

c++ - OpenCV 视频模块教程

Python:在为 __init__subclass__() 提供参数的同时动态创建类

java - 如何将当前时间存储到外部存储器?

c++ - 找不到 Visual Studio 2013 的 WRL 项目模板

Javascript - 经理是一个人而不是经理本身?功能/原型(prototype)继承

c++ - 继承和 memcpy - 它是如何协同工作的?

c++ - 二进制兼容性因虚函数而中断