我有一个接口MuInterface
(抽象类)。我有3个派生自该界面的类:
class A : public MyInterface //...
class B : public MyInterface //...
class C : public MyInterface //...
我有一个接口矢量:std::vector< std::shared_ptr< MyInterface > > theVec;
,包含A
,B
和C
类型的对象。是否有可能在for循环中知道迭代该向量以显示当前对象的类型(如果它是A
,B
或C
)?我想到了类似静态字符串成员的东西,但是如何&#34;虚拟化&#34;它?如果我使用显示静态const字符串的虚函数,那没关系:
virtual const std::string getType() { return classType; } // classType is static const std::string defined for each class
答案 0 :(得分:3)
正如Luchian所指出的那样,接口的目的通常是分发一份“契约”,无论其类型如何都应该实现:只要你提供界面的功能,你就可以了。
不确定为什么需要它,但您可以通过请求提供类似getType
的功能强制进行类型识别(肯定可能)
class MyInterface {
public:
virtual const std::string identify() = 0;
};
class A : public MyInterface {
public:
const std::string identify() {
return std::string("A");
}
};
// ... the same for B and C ...
int main() {
std::vector<std::shared_ptr<MyInterface>> theVec;
theVec.push_back(std::make_shared<A>());
theVec.push_back(std::make_shared<B>());
theVec.push_back(std::make_shared<C>());
std::cout << theVec[0]->identify();
std::cout << theVec[1]->identify();
std::cout << theVec[2]->identify();
}
另一个更加变态的解决方案可能是使用CRTP模式专门化您的方法,尽管我认为在这种情况下它会有点过分。