C++多态性:从基类到派生类

C++ polymorphism: going from base class to derived class

本文关键字:派生 基类 多态性 C++      更新时间:2023-10-16
class A{};
class B : A{};
void func(A* p)
{
      B* p2 = p; // Error
}

你的代码有几个奇怪的地方。

  1. 使用私有继承。在私有继承中,当您不在类范围本身内时,您将无法转换为派生类。
  2. 即使你将公开继承,你也需要基类中至少有一个虚函数(应该是析构函数)才能使用 dynamic_cast
  3. 当你需要大量的向下投射时,你很可能做错了什么。您可能应该重新考虑所提供 API 的设计或使用。

通常,事情看起来像这样:

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

class Derived : public A {
};
void func(A* a) {
  if(Derived* d = dynamic_cast<Derived*>(a)) {
    // yeah, a is of type derived
  } else {
    // a is not of type Derived 
  }
}

is-a关系是通过public继承来实现的。 由于您private继承它,因此association关系不是is-a。 所以B不是A.因此,您不能将A存储在B中,否则A无法成为B

并且dynamic_cast不起作用,因为源类型不是多态
static_cast都行不通,因为"A"是"B"的不可访问的基础

要建立is-a关系,您需要做class B: public A{}

对于类,默认使用私有继承。