Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这两种代码之间有什么区别? 我想知道为什么这段java代码产生的输出与C++中的代码相同。 #include "stdafx.h" #include <iostream> using namespace std; class A { public: A(){ this->Foo(); } virtual void Foo() { cout << "A::Foo()" << endl; } }; class B : public A { public: B() { this->Foo(); } virtual void Foo() { cout << "B::Foo()" << endl; } }; int main(int, char**) { B objB; system("pause"); return 0; }_Java_C++_Inheritance - Fatal编程技术网

这两种代码之间有什么区别? 我想知道为什么这段java代码产生的输出与C++中的代码相同。 #include "stdafx.h" #include <iostream> using namespace std; class A { public: A(){ this->Foo(); } virtual void Foo() { cout << "A::Foo()" << endl; } }; class B : public A { public: B() { this->Foo(); } virtual void Foo() { cout << "B::Foo()" << endl; } }; int main(int, char**) { B objB; system("pause"); return 0; }

这两种代码之间有什么区别? 我想知道为什么这段java代码产生的输出与C++中的代码相同。 #include "stdafx.h" #include <iostream> using namespace std; class A { public: A(){ this->Foo(); } virtual void Foo() { cout << "A::Foo()" << endl; } }; class B : public A { public: B() { this->Foo(); } virtual void Foo() { cout << "B::Foo()" << endl; } }; int main(int, char**) { B objB; system("pause"); return 0; },java,c++,inheritance,Java,C++,Inheritance,JAVA代码是: public class Testa { public Testa() { this.Foo(); } public static void main(String[] args) { Testb b = new Testb(); } void Foo() { System.out.println("A"); } } class Testb extends

JAVA代码是:

public class Testa {
    public Testa()
    {
        this.Foo();
    }
    public static void main(String[] args) 
    {
        Testb b = new Testb();
    }
    void Foo()
    {
        System.out.println("A");
    }

}
class Testb extends Testa {
    public Testb()
    {
        this.Foo();
    }
    @Override
    void Foo()
    {
        System.out.println("B");
    }
}
此代码仅生成

B
B
在这种情况下,为什么输出不同?

Edit

我的答案的第一部分是在Java
Testa
构造函数加入之前给出的


代码中,没有C++代码中定义的<特斯塔> <代码>构造函数。这就解释了为什么Java只打印一个
B

但即使您这样做了,为了使代码更加等效:

public Testa()
{
   this.Foo();
}
它会打印出来

B
B

因为在Java中,即使从构造函数调用方法,多态性也可以工作。但是这样做不是一个好主意,因为当在
Testb

中调用方法
Foo
时,对象
Testb
的子部分仍然是未初始化的。不同之处在于构造过程中对多态性的处理。在Java中,对象的动态类型是派生类的动态类型,允许您在构造函数有机会设置成员变量之前调用成员函数。这很糟糕


C++有一种不同的方法:当构造函数运行时,对象的类型被认为是构造函数所属的类之一。所有对成员函数的调用都是根据该假设静态解决的。因此,<代码> A/<代码>的构造函数调用<代码:A::(Foe:)/Cuth>,而构造函数<代码> B::FooWoE()/代码> .< /P> C++中,不应该调用构造函数(或析构函数)中的虚函数,我不做太多java,所以我不会在上面讲。注意C++代码中,你从两个构造函数调用FO,在Java代码中,您仅从Testb.Oops的构造函数调用它,很抱歉我键入了错误,一秒钟…C++:在执行基A的构造函数时,虚拟B不存在,因此在输出中显示A。之后,在B的构造函数的执行中,B的虚函数存在,因此B显示在输出中。当您在构造函数和析构函数中调用虚函数时,被调用的函数是该构造函数/析构函数的类可用的函数。所以在你的例子中,即使B覆盖了A的foo。A的foo将被称为。这是因为B不是完全构造的,所以它的vtable和A的vtable是一样的好酷,你能读懂我的意思。所以这在C++中不起作用吗?@ Mattjuns-不,它不是。@ Mattjon,我知道的java比C++多。我不知道为什么C++的行为不同。但我可以验证它在C++中打印了代码<:::():(代码)>代码> >:b::():(代码)< /代码>。
B
B