我确实在SO上发现了一些类似标题的问题 - 但是当我读到答案时,他们关注的是问题的不同部分,这些部分是非常具体的(例如STL /容器).
有人可以告诉我为什么你必须使用指针/引用来实现多态?我可以理解指针可能会有所帮助 - 但肯定只能引用区分传值和传递参考?
当然,只要你在堆上分配内存 - 这样你就可以拥有动态绑定,那么这就足够了 - 显然不是.
我想我理解虚方法和vtable的概念,但是我不明白为什么将对象作为指针(或引用)传递并通过值传递它(将哪种方式丢弃vtable或其他东西)之间存在差异?
为什么会这样的工作:
Material* m = new Texture;
poly->setMaterial(m);
// methods from Texture are called if I keep carrying the pointer around
Run Code Online (Sandbox Code Playgroud)
而不是这个?:
Material m = Texture();
poly->setMaterial(m);
// methods from Material are called if I pass the value around
Run Code Online (Sandbox Code Playgroud) c++ polymorphism inheritance virtual-functions object-slicing
我是一名Java程序员,最近开始学习C++.我很困惑.
我理解在C++中,要实现多态行为,必须使用指针或引用.例如,考虑Shape具有已实现方法的类getArea().它有几个子类,每个子类都以不同方式覆盖getArea().比考虑以下功能:
void printArea(Shape* shape){
cout << shape->getArea();
}
Run Code Online (Sandbox Code Playgroud)
该函数getArea()根据Shape指针指向的具体内容调用正确的实现.
这也是一样的:
void printArea(Shape& shape){
cout << shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)
但是,以下方法不适用于多态:
void printArea(Shape shape){
cout << shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)
无论Shape函数中传递的是哪种具体类型,getArea()都会调用相同的实现:默认值为Shape.
我想了解这背后的技术推理.为什么多态性适用于指针和引用,而不适用于普通变量?(我认为这不仅适用于功能参数,也适用于任何事情).
请解释一下这种行为的技术原因,帮助我理解.