具有boost scoped_ptr的C++多态性
C++ polymorphism with boost scoped_ptr
为什么下面的代码不允许调用foo(ptr)?
#include <boost/scoped_ptr.hpp>
struct A {
virtual ~A() {}
};
struct B: public A {};
void foo(boost::scoped_ptr<A>& a) {}
void goo(A& a) {}
int main() {
boost::scoped_ptr<B> ptr(new B);
foo(ptr);
B b;
goo(b);
}
我们传递引用的相应表单按预期工作。我们不应该做多态性吗使用boost scoped_ptr?
g++与升压1.49给我:
error: invalid initialization of reference of type ‘boost::scoped_ptr<A>&’ from expression of type ‘boost::scoped_ptr<B>’
这是因为foo
出于某种原因,通过引用来获取作用域指针。这是完全没有必要的,也是呼叫失败的原因。有从scoped_ptr<B>
到scoped_ptr<A>
的转换,但没有从scoped_ptr<B>&
到scoped_ptr<A>&
的转换。
您应该将其作为const的引用传递。
void foo(boost::scoped_ptr<A> const & a) {}
顺便说一句,这本身并不是智能指针的"问题"。以下代码失败的原因与您的代码相同。
void foo(A*& p) {}
int main()
{
B* p = new B;
foo(p); //FAIL
}
为了解决这个问题,你必须通过值传递指针,或者,如果你足够变态,通过引用const
void foo (A * const & p); // <-- a perv wrote this
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?