我在这里做错了什么? 我不敢相信下面没有编译。 需要使用共享指针强制转换之类的吗?
struct Base
{
};
class Child : Base
{
};
int main()
{
std::shared_ptr<Base> p = std::make_shared<Child>();
}
我在使用Microsoft编译器时遇到的错误是
error C2440: 'initializing': cannot convert from 'std::shared_ptr<Child>' to 'std::shared_ptr<Base>'
确实有用。 只是基本
具有私有
继承。
struct Child : Base{};
或
class Child : public Base{};
都是修复。 有趣的是,std::static_pointer_cast
和company确实存在; 但你不需要他们在这里。 参见https://en.cppreference.com/W/cpp/memory/shared_ptr/pointer_cast
您应该改用公共继承:
class Child : public Base
{
};
虽然@Bathsheba和@Divinas的回答解决了这个问题,但他们都没有解释为什么这是解决问题的方法,我认为对于未来的观众来说,知道为什么这是问题所在是很重要的。
当您试图创建指向基类base
的指针时,您试图获得对属于派生类(在本例中为child
)的基类的所有公共成员的访问权限。 如果派生类私有地继承基类(或受保护地继承基类),则基类中标记为公共的所有成员现在都标记为私有(或受保护)。 这意味着试图以公共成员身份访问它们将引起访问权限冲突问题。 由于访问权限在编译时已知,因此这是一个编译错误。
解决方案,正如前面的回应中提到的,是使用公共继承来继承基类。 它是结构
中的默认继承,是类
中的非默认继承。