shared_ptr具有多个接口

时间:2017-02-18 23:23:12

标签: c++ c++11 shared-ptr

考虑以下课程:

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)。任何人都可以重现这个吗?

2 个答案:

答案 0 :(得分:4)

MyInterface1MyInterface2完全不相关的类型。仅仅因为c1指向的对象具有从两者继承的运行时类型,静态类型是不兼容的,您将不得不使用强制转换将一个转换为另一个

shared_ptr<MyInterface1> c1;
shared_ptr<MyInterface2> c2;
MyFunction(c1);
c2 = dynamic_pointer_cast<MyInterface2>(c1);

Live Example

这当然只有在*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。