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

ven*_*rty 6 c++

我有以下

class base
{
};

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

};
Run Code Online (Sandbox Code Playgroud)

我现在有

base* pbase = new derived();
  pbase->myFunc();
Run Code Online (Sandbox Code Playgroud)

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

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

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

jua*_*nza 6

myfunc需要可从基类访问,因此您必须myfuncbase. 如果您打算base成为抽象基类,即无法实例化并充当接口的基类,则可以将其设为纯虚拟:

class base
{
 public:
  virtual void myfunc() = 0; // pure virtual method
};
Run Code Online (Sandbox Code Playgroud)

如果您希望能够实例化base对象,那么您必须提供以下实现myfunc

class base
{
 public:
  virtual void myfunc() {}; // virtual method with empty implementation 
};
Run Code Online (Sandbox Code Playgroud)

如果您想从指向基类的指针访问函数,则没有其他干净的方法可以做到这一点。最安全的选择是使用dynamic_cast

base* pbase = new derived;

....
derived* pderived = dynamic_cast<derived*>(pbase);
if (derived) {
  // do something
} else {
  // error
}
Run Code Online (Sandbox Code Playgroud)


Kar*_*k T 6

如果您坚持认为此功能不应该是 base 的一部分,那么您只有 2 个选项可以执行此操作。

要么使用指向派生类的指针

derived* pDerived = new derived();
pDerived->myFunc();
Run Code Online (Sandbox Code Playgroud)

或者(更丑陋强烈不鼓励)将指针 static_cast 指向派生类类型,然后调用该函数
注意:要谨慎使用。仅当您确定要强制转换的指针的类型时才使用,即您确定它pbase是 aderived或派生自 的类型derived。在这种特殊情况下没问题,但我猜这只是实际代码的一个例子。

base* pbase = new derived();
static_cast<derived*>(pbase)->myFunc();
Run Code Online (Sandbox Code Playgroud)