指向 C++ 中派生类的基类指针
the base class pointer to the derived class in 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,有什么问题?
类 B 派生自类 A,但将其标记为受保护。这意味着只有 B 的子类"看到"B 派生自 A。
由于主例程不是 B 的子类,因此它只看到 B,而不是 B 派生自 A。因此,不能将 B 指针转换为 A 指针。
要解决它,请将其更改为:
class B: public A {
public:
virtual ~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。
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- C++函数解析基类指针到派生类指针
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 从基类指针派生派生类的模板类型
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 无法将派生类存储在基类指针的向量中
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 基类指针:在哪里使用 new 和 delete
- 如何在CRTP实现中传递基类指针
- C++继承从基类指针访问派生类中的非虚拟函数
- 通过基类指针获取派生类对象的引用
- C++通过基类指针提升子类的序列化
- 将派生对象分配给函数内的基类指针
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?