私有继承类不创建动态对象

时间:2010-04-06 07:48:26

标签: c++ inheritance

以下代码不允许我创建对象的原因是什么。

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 *'存在,但是   不可访问“

提前致谢:)

6 个答案:

答案 0 :(得分:3)

问题是你正在使用私有继承;这意味着只能在您的类中看到继承(在本例中为derived)。您无法将base*指向类外的derived实例(在本例中为main()),因为无法访问继承(因此,转换)。

这与尝试从类外部访问私有成员完全相同。

事实上,“私有继承”这个名称是非常误导的,因为它没有实现真正的继承。在您的示例中,derived实例不是base;它只是用base实现的,这就是“私有继承”的含义。如果您想使用私有继承,则应考虑使用简单聚合(即:basederived的私有指针)的可能性。在大多数情况下(大多数情况下,并非总是如此),私有继承没有任何优势,并且存在一些微妙的问题。

答案 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)

我的猜测:由于对派生类的私有继承而导致编译器创建的基类的默认构造函数/复制构造函数是私有的,并且不能由类型转换使用