我可以命名从接口派生的每个类吗?

时间:2014-11-06 09:51:05

标签: c++ c++11

我有一个接口MuInterface(抽象类)。我有3个派生自该界面的类:

class A : public MyInterface //...
class B : public MyInterface //...
class C : public MyInterface //...

我有一个接口矢量:std::vector< std::shared_ptr< MyInterface > > theVec;,包含ABC类型的对象。是否有可能在for循环中知道迭代该向量以显示当前对象的类型(如果它是ABC)?我想到了类似静态字符串成员的东西,但是如何&#34;虚拟化&#34;它?如果我使用显示静态const字符串的虚函数,那没关系:

virtual const std::string getType() { return classType; } // classType is static const std::string defined for each class

1 个答案:

答案 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();
}

Example

另一个更加变态的解决方案可能是使用CRTP模式专门化您的方法,尽管我认为在这种情况下它会有点过分。