繁体   English   中英

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

[英]convert an object created with base class ctor to a derived class

我有以下课程:

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样式强制转换会出现段错误。 反正有实现这一目标的方法吗?

请注意,我的对象已经使用Derived ctor创建了。 我只想使用接口来区别对待它们

实现此目的的唯一方法是创建一个新对象,然后将数据从旧对象移出。

尝试封装在运行时需要更改的行为。 而不是从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对象,并将它们中的任何一个与派生对象相关联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM