在 C++ 中将派生类指针分配给基类指针

assigning derived class pointer to base class pointer in C++

本文关键字:指针 分配 基类 派生 C++      更新时间:2023-10-16

我有以下

class base
{
};
class derived : public base
{
  public:
   derived() {}
   void myFunc() { cout << "My derived function" << std::endl; }
};

现在我有

base* pbase = new derived();
  pbase->myFunc();

我收到错误 myFunc 不是 base 的成员函数。

如何避免这种情况?以及如何让myFunc被调用?

注意我应该让基类不包含任何函数,因为它是设计的一部分,上面的代码是大函数的一部分

如果您坚持认为此功能不应该是 base 的一部分,那么您只有 2 个选项可以做到这一点。

使用指向派生类的指针

derived* pDerived = new derived();
pDerived->myFunc();

或者(丑陋强烈不鼓励)将指针static_cast到派生类类型,然后调用函数
注意:请谨慎使用。仅当您确定要投射的指针的类型时才使用,即您确定pbasederived或派生自derived的类型。在这种特殊情况下还可以,但我猜这只是实际代码的一个例子。

base* pbase = new derived();
static_cast<derived*>(pbase)->myFunc();

myfunc需要从基类访问,因此您必须在base中声明一个公共虚拟myfunc。如果你打算base让它成为抽象的基类,即一个不能被实例化并充当接口的基类,你可以让它成为纯虚拟的:

class base
{
 public:
  virtual void myfunc() = 0; // pure virtual method
};

如果你希望能够实例化base对象,那么你必须为myfunc提供一个实现:

class base
{
 public:
  virtual void myfunc() {}; // virtual method with empty implementation 
};

如果要从指向基类的指针访问函数,则没有其他干净的方法可以执行此操作。最安全的选择是使用dynamic_cast

base* pbase = new derived;
....
derived* pderived = dynamic_cast<derived*>(pbase);
if (derived) {
  // do something
} else {
  // error
}

若要使用基类指针,必须将基类定义更改为:

class base
{
public:
    virtual void myFunc() { }
};

我看不出其他办法。不好意思。

您可以将其添加为 base 的成员,并使其成为虚拟或纯虚拟函数。但是,如果使用此路由,则还应在基类中添加虚拟析构函数,以允许成功销毁继承的对象。

class base
{
public:
   virtual ~base(){};
   virtual void myFunc() = 0;
};
class derived : public base
{
  public:
   derived() {}
   void myFunc() { cout << "My derived function" << std::endl; }
};