c ++中派生类的基类指针

时间:2011-05-06 20:20:48

标签: c++

#include <iostream>
using namespace std;

class A {
    public:
        A ();
        virtual ~A();
};

class B: protected A {
    public:
        virtual ~B ();
};

int main() {
    A* pb = new B;//A is inaccessable base of B
    return 0;
}

当我运行上面的代码时,它告诉我A是B不可访问的基础,pb是指针,指向B的指针,有什么问题?

10 个答案:

答案 0 :(得分:8)

B类派生自A类,但将其标记为受保护。 这意味着只有B'的子类'看到'B派生自A。

由于主例程不是B的子类,它只看到B,而不是B从A派生。 因此,您不能将B指针强制转换为A指针。

要解决此问题,请将其更改为:

class B: public A {
public:
    virtual ~B ();
};

答案 1 :(得分:2)

B受保护继承自A,因此只有B'的子类知道'它是A'。静态main()不“知道”它,因为它不从B继承。
在这种情况下你可以将B作为A来访问:

class C: B {
    void foo() {
        A* pb = new B;
    }
};

如果您需要在主要内容中,则需要将B更改为公开继承自A

答案 2 :(得分:1)

这是因为你从protected继承了A.将其更改为public,您将获得预期的结果。

请参阅C ++ FAQ部分24.5 here

答案 3 :(得分:1)

问题是受保护的继承。 B不是A. B有A.有关详细信息,请参阅此FAQ

答案 4 :(得分:0)

如果你改变了

class B: protected A

class B: public A

有效吗?

答案 5 :(得分:0)

问题是你从A继承B为protected,因此外部代码不允许'知道'B继承自A.用public替换protected,代码应该编译。

答案 6 :(得分:0)

B导出public A,而不是protected A

class B: public A
{
public:
    virtual ~B ();
};

答案 7 :(得分:0)

您正在使用受保护的继承。受保护,当应用于成员时,意味着“派生类可以访问,但外部调用者不能访问”。当应用于继承时,它意味着......完全相同的事情。

因此,在B类中,您知道它来自A,并且可以转换为A*并返回

B之外的 (例如,在main函数中),继承不可见,因此您无法转换{{1转到B*

答案 8 :(得分:0)

#include <iostream>

using namespace std;

class A {
    public:
        A () {};
        virtual ~A();
};

class B: public A {
    public:
        B() {};
        virtual ~B ();
};

int main() {
    A* pb = new B;
    return 0;
}

这似乎有效。在您的示例中,您为将来的继承做好准备,受保护的继承使A受保护,只有B方法可以看到A.

答案 9 :(得分:0)

继承的属性排除了将受保护的父类派生到子类中的可能性。因此,在类代码中实际上不会发生类A到B类的属性。除非您在行protected中将public更改为#10,否则将遵循协议,代码如下所示:

class B: public A
{
public:
    virtual ~B ();
};