0

我有以下结构,其中一些是在框架中定义的,而另一些则不是,如评论中所示:

struct FixedInterface { // from the framework
   virtual ~FixedInterface() {}
}

struct MyAdditionalInterface { // generic, personal/additional interface
};

我的程序中的以下结构可以从上述两种结构派生出来,并被使用/传递给强类型框架

struct MyFirstInterface : MyAdditionalInterface, FixedInterface {
};

struct MySecondInterface : FixedInterface {
};

struct MyThirdInterface : MyAdditionalInterface, FixedInterface {
};

// ...

struct MyNthInterface : FixedInterface {
};

现在框架让我定义和“注入”一个具有以下签名的自定义函数。框架在需要时调用此函数:

void MyClass::my_function(const FixedInterface& obj) {
}

在上述函数的主体中,我需要一种方法来知道 obj 是否是MyAdditionalInterface(即MyFirstInterfaceor MyThirdInterface)的实例,以便我可以将 obj 转换为使用MyAdditionalInterface.

我怎样才能获得这些信息?我可以自由地修改我的结构,只要我不改变层次结构并且MyAdditionalInterface没有 vtable(没有虚函数或析构函数,原因是框架不允许我这样做)。

我可以免费使用Boost以防万一。我可以访问 C++11。

4

1 回答 1

1

Adynamic_cast会工作;

MyAdditionalInterface obj2 = dynamic_cast<MyAdditionalInterface const&>(obj)

它会抛出异常objis not a MyAdditionalInterface

但是,使用dynamic_cast表示您应该重新设计层次结构。

一种可能的解决方案 (1)

看来您只MyAdditionalInterfaceFixedInterface?

如果是这样的话,

struct MyAdditionalInterface : FixedInterface { ... }

然后,定义 2 个重载。

void MyClass::my_function(const FixedInterface& obj) {
}
void MyClass::my_function(const MyAdditionalInterface& obj) {
}

一种可能的解决方案 (2)

例如,让我们定义

struct MyConvolutedInterface : MyAdditionalInterface, FixedInterface {
    ...
}

然后重新定义类如下

struct MyFirstInterface : MyConvolutedInterface  {
};

struct MySecondInterface : FixedInterface {
};

struct MyThirdInterface : MyConvolutedInterface  {
};

// ...

struct MyNthInterface : FixedInterface {
};

然后,定义2个重载

void MyClass::my_function(const FixedInterface& obj) {
}
void MyClass::my_function(const MyConvolutedInterface& obj) {
}

但是,我怀疑这在许多情况下是否是最佳解决方案。

于 2013-03-14T09:40:33.227 回答