簡體   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