[英]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.