这有多虚拟?

Eta*_*tam 4 c++ methods polymorphism virtual

你能解释一下为什么:

int main (int argc, char * const argv[]) {
    Parent* p = new Child();
    p->Method();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印" Child :: Method() ",这个:

int main (int argc, char * const argv[]) {
    Parent p = *(new Child());
    p.Method();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印" Parent :: Method() "?

类别:

class Parent {
public:
    void virtual Method() {
        std::cout << "Parent::Method()";
    }
};

class Child : public Parent {
public:
    void Method() {
        std::cout << "Child::Method()";
    }
};
Run Code Online (Sandbox Code Playgroud)

谢谢,Etam.

Kon*_*lph 11

您的第二个代码将对象复制ChildParent变量中.通过一个称为切片的过程,它会丢失所有特定于Child(即所有私有字段部分Child)的信息,并因此丢失与之关联的所有虚拟方法信息.

此外,你的代码泄漏内存(但我想你知道这一点).

但是,您可以使用引用.例如:

Child c;
Parent& p = c;
p.Method(); // Prints "Child::Method"
Run Code Online (Sandbox Code Playgroud)


sha*_*oth 9

在第一种情况下,您调用的实际对象是Child类:

Parent* p = new Child(); // you new'ed Child class
p->Method(); // and a method of a Child class object is getting called
Run Code Online (Sandbox Code Playgroud)

这就是调用Child :: Method()的原因.在第二种情况下,将Child类对象复制到Parent类对象:

Parent p = *(new Child()); // you new'ed Child, then allocated a separate Parent object on stack and copied onto it
p.Method(); // now you have a Parent object and its method is called
Run Code Online (Sandbox Code Playgroud)

和Parent :: Method()被调用.