指向 C++ 中派生类的基类指针

the base class pointer to the derived class in c++

本文关键字:基类 指针 派生 C++ 指向      更新时间:2023-10-16
#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,有什么问题?

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

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

要解决它,请将其更改为:

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

受到保护,继承自 A,因此只有 B 的子类"知道"它是 A。
在这种情况下,您可以将 B 作为 A 访问:

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

如果你主要需要它,你需要将 B 更改为从 A 的公共继承

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

请参阅此处的C++常见问题解答第 24.5 节。

问题是受保护的继承。B 不是 A,B 是 A。有关更多详细信息,请参阅此常见问题解答。

如果您更改

class B: protected A

class B: public A

行得通吗?

问题是你从 A 继承了 B 作为protected,因此不允许外部代码"知道"B 从 A 继承。

public A 派生B,而不是protected A

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

您正在使用受保护的继承。受保护,当应用于成员时,意味着"派生类可以访问,但外部调用方不能"。当应用于继承时,这意味着...一模一样的事情。

所以在B类中,你知道它是从A派生的,并且可以强制转换为A*并返回

BUt B之外(例如,在 main 函数中),继承不可见,因此无法将B*转换为A*

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

class B: public A
{
public:
    virtual ~B ();
};
#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;
}

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