将使用基类ctor创建的对象转换为派生类

时间:2017-05-13 08:53:21

标签: c++ inheritance multiple-inheritance

我有以下课程:

class Base {
public:
  virtual ~Base(){}
  Base() {}

  virtual void foo() = 0;
};

class Derived : public Base {
public:
  virtual ~Derived(){}
  Derived() : Base() {}

  void foo() { printf("derived : foo\n"); }
};

class IInterface {
public:
  virtual ~IInterface() {}

  virtual void bar() = 0;
};

class C : public Derived, public IInterface {
public:
  virtual ~C(){}
  C() : Derived(){}

  void bar() { printf("C : bar\n"); }
};

现在我有一堆Derived*个对象,我想对它们应用不同的接口:

  Derived* d = new Derived();
  C* c = dynamic_cast<C*>(d);
  c->bar();
  c->foo();

dynamic_cast返回nullptr并且使用c-style cast我得到seg错误。 无论如何要实现这个目标吗?

请注意,我的对象已经使用Derived ctor创建。 我只想用接口

来区别对待它们

2 个答案:

答案 0 :(得分:1)

实现这一目标的唯一方法是创建一个新对象并从旧对象移动数据。

答案 1 :(得分:0)

尝试封装需要在运行时更改的行为。您没有从IInterface继承,而是有一个成员变量,它是一个IInterface指针。然后,不是覆盖子类中的bar,而是将调用传递给bar,直到指向的任何内容。这允许模块化行为看起来像多态,但更灵活:

class IInterface {
public:
  virtual ~IInterface() {}

  virtual void bar() = 0;
};
class Derived : public Base {
public:
  IInterface* m_bar;

  virtual ~Derived(){}
  Derived() : Base(){}

  void bar() {return m_bar->bar(); }
  void foo() { printf("derived : foo\n"); }
};

然后,您可以派生并创建IInterface对象,并可以将它们与Derived对象相关联。