以下代码不允许我创建对象的原因是什么。
class base
{
public:
void foo()
{ cout << "base::foo()"; }
};
class derived : private base
{
public:
void foo()
{ cout << "deived::foo()"; }
};
void main()
{
base *d = new derived();
d->foo();
}
它给了我错误:
“'type cast':转换自 'derived *'到'base *'存在,但是 不可访问“
提前致谢:)
答案 0 :(得分:3)
问题是你正在使用私有继承;这意味着只能在您的类中看到继承(在本例中为derived
)。您无法将base*
指向类外的derived
实例(在本例中为main()
),因为无法访问继承(因此,转换)。
这与尝试从类外部访问私有成员完全相同。
事实上,“私有继承”这个名称是非常误导的,因为它没有实现真正的继承。在您的示例中,derived
实例不是base
;它只是用base
实现的,这就是“私有继承”的含义。如果您想使用私有继承,则应考虑使用简单聚合(即:base
内derived
的私有指针)的可能性。在大多数情况下(大多数情况下,并非总是如此),私有继承没有任何优势,并且存在一些微妙的问题。
答案 1 :(得分:2)
因为您使用了私有继承,所以派生对象不是一种基础对象。所以当你说:
base *d = new derived();
指向派生的指针无法转换为指向基础的指针 - 两者之间没有真正的关系。您可以创建派生对象:
derived d;
derived * dp = new derived();
答案 2 :(得分:0)
私有继承会导致您的基类详细信息在派生类之外不可见。所以错误C2243:访问保护(受保护或私有)阻止从指向派生类的指针转换为指向基类的指针。
您应该使用公共继承。
答案 3 :(得分:0)
使其发挥作用的两种方法:
class base
{
public:
void foo()
{ std::cout << "base::foo()"; }
};
class derived : public base // <-- make it public
{
public:
void foo()
{ std::cout << "derived::foo()"; }
};
void main()
{
base *d = new derived();
d->foo();
}
或:
class base
{
public:
void foo()
{ std::cout << "base::foo()"; }
};
class derived : private base
{
public:
void foo()
{ std::cout << "derived::foo()"; }
};
void main()
{
derived *d = new derived(); // create pointer on derived, not base
d->foo();
}
希望有所帮助, EXA
答案 4 :(得分:0)
参见C ++标准(草案)中的ch.11.2.3。您必须使用显式强制类型转换,因为隐式强制转换(base * d = new derived();)中使用的复制构造函数是不可访问的。
答案 5 :(得分:-1)
我的猜测:由于对派生类的私有继承而导致编译器创建的基类的默认构造函数/复制构造函数是私有的,并且不能由类型转换使用