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

时间:2012-11-19 09:08:40

标签: c++

我有以下

class base
{
};

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

};

现在我有

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

我正在收到错误myFunc不是基础的memember函数。

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

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

4 个答案:

答案 0 :(得分:4)

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

使用指向派生类的指针

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

或(丑陋&amp; 强烈气馁)static_cast指向派生类类型的指针然后调用函数
注意:谨慎使用 。仅在您确定要投射的指针类型时使用,即您确定pbasederived或从derived派生的类型。在这种特殊情况下它可以,但我猜这只是实际代码的一个例子。

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

答案 1 :(得分:3)

myfunc需要可以从基类访问,因此您必须在myfunc中声明公共虚拟base。如果您希望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
}

答案 2 :(得分:2)

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

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

我看不出别的办法了。遗憾。

答案 3 :(得分:0)

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

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

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

};