【问题标题】:using dynamic_cast to point to other derived class object使用 dynamic_cast 指向其他派生类对象
【发布时间】:2012-08-12 15:18:46
【问题描述】:

我有以下情况。有两个基类:Base1、Base2 和两个派生类:Derived、sysCommandExecutor,派生如下:

#include <iostream>
using namespace std;

class Base1 { virtual void dummy() {} };
class Base2 { virtual void dumy() {} };
class Derived: virtual public Base1, public Base2
{ int a; };

class sysCommandExecutor : public Base2
{
public:
int b;
Base1 *ptr;
void func(void);
};

void sysCommandExecutor::func(void)
{
  Derived *d;
  d = dynamic_cast<Derived *>(ptr);
  if (d == NULL)
  std::cout << "This is NULL" << std::endl;
  else
  {
  // Call a function of Derived class
  }
}

int main () {
   try {
   sysCommandExecutor * sys =  new sysCommandExecutor;
   sys->func();
   return 0;
   }
}                                         

我想在 func 中调用“派生”类的这个函数,但 dynamic_cast 失败。 我无法在 sysCommandExecutor 类中创建该函数,因为那是其他人的代码。 如何让sysCommandExecutor类中的ptr指针指向Derived类对象??

提前致谢

【问题讨论】:

  • ptr 分配了什么?在您的代码中,它是一个未初始化的指针
  • 代码看起来很奇怪。似乎没有正确使用多态性。你有一个指向同一个实例的派生类指针。
  • codepad.org/f65rqtYqNo errors or program output.
  • 1) Derived 中没有方法。 2) ptr 未初始化。 3)这里不需要new(更不用说泄漏了)。
  • 另外,请注意设计缺陷,因为Base1 *ptr 不一定引用Derived 对象。通常多态性会在相反的方向起作用,Derived* d 将转换为Base1 * 或Base2* ,而不是相反。考虑一下,所有雪佛兰都是汽车,但并非所有汽车都是雪佛兰。您可能正在尝试将福特换成雪佛兰。

标签: c++ oop dynamic-cast


【解决方案1】:

您正在引用一个未初始化的指针ptr

如果我将 main 更改为:

int main () {
   sysCommandExecutor * sys =  new sysCommandExecutor;
   sys->ptr=new Derived;
   sys->func();
   delete dynamic_cast<Derived *>(sys->ptr);
   delete sys;
   return 0;

} 

有效

你也缺少一个虚拟 dtor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2021-07-02
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多