我有以下课程:
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创建。
我只想用接口
答案 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对象相关联。