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
您的第二个代码将对象复制Child到Parent变量中.通过一个称为切片的过程,它会丢失所有特定于Child(即所有私有字段部分Child)的信息,并因此丢失与之关联的所有虚拟方法信息.
此外,你的代码泄漏内存(但我想你知道这一点).
但是,您可以使用引用.例如:
Child c;
Parent& p = c;
p.Method(); // Prints "Child::Method"
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,您调用的实际对象是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()被调用.
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |