考虑以下课程:
class MyInterface1 {
...
};
class MyInterface2 {
...
};
class MyClass : public MyInterface1, public MyInterface2 {
...
};
如果我有以下代码:
void MyFunction(shared_ptr<MyInterface1>& out); // returns a make_shared<MyClass>
shared_ptr<MyInterface1> c1;
shared_ptr<MyInterface2> c2;
MyFunction(c1);
c2 = c1;
我无法将c2分配给c1。
此外,如果我只是调用MyFunction(c2)
,它也不会编译,因为MyClass是从MyInterface1和MyInterface2派生的,所以我希望它可以工作。这似乎是一个值得分享的编译器错误(Visual Studio 2015 Update 3)。任何人都可以重现这个吗?
答案 0 :(得分:4)
MyInterface1
和MyInterface2
完全不相关的类型。仅仅因为c1
指向的对象具有从两者继承的运行时类型,静态类型是不兼容的,您将不得不使用强制转换将一个转换为另一个
shared_ptr<MyInterface1> c1;
shared_ptr<MyInterface2> c2;
MyFunction(c1);
c2 = dynamic_pointer_cast<MyInterface2>(c1);
这当然只有在*c1
的实际动态类型继承自MyInterface2
时才有效。与任何dynamic_cast
一样,如果类型不兼容,dynamic_pointer_cast
将返回nullptr
。
答案 1 :(得分:-5)
您可以使用原始指针执行此操作,但无法使用shared_ptr。不要使用shared_ptr,而是这样做:
void MyFunction(MyInterface1* out); // returns a new MyClass()
MyInterface1* c1;
MyInterface2* c2;
MyFunction(c1);
c2 = (MyInterface2*)c1;
MyFunction((MyInterface1*)c2);
它肯定更清洁,更容易,更易于维护。它也更快,因为你不再使用shared_ptr并且开销较少。如果你关心性能,请不要使用shared_ptr。