#include <iostream>
#include <vector>
#include <memory>
class MatrixInterface
{
public:
virtual ~MatrixInterface() = default;
virtual void doSomething() const = 0;
};
class MatrixA : public MatrixInterface
{
public:
void doSomething() const override
{
std::cout << "This is MatrixA" << std::endl;
}
};
class MatrixB : public MatrixInterface
{
void doSomething() const override
{
std::cout << "This is MatrixB" << std::endl;
}
};
class MatrixC : public MatrixInterface
{
void doSomething() const override
{
std::cout << "This is MatrixC" << std::endl;
}
};
int main() {
using VectorType = std::vector<std::unique_ptr<MatrixInterface>>;
VectorType matricies;
matricies.push_back(VectorType::value_type(new MatrixA));
matricies.push_back(VectorType::value_type(new MatrixB));
matricies.push_back(VectorType::value_type(new MatrixC));
for(auto& element : matricies)
{
element->doSomething();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgTWF0cml4SW50ZXJmYWNlCnsKcHVibGljOgoJdmlydHVhbCB+TWF0cml4SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwoJCgl2aXJ0dWFsIHZvaWQgZG9Tb21ldGhpbmcoKSBjb25zdCA9IDA7Cn07CgpjbGFzcyBNYXRyaXhBIDogcHVibGljIE1hdHJpeEludGVyZmFjZQp7CnB1YmxpYzoKCXZvaWQgZG9Tb21ldGhpbmcoKSBjb25zdCBvdmVycmlkZQoJewoJCXN0ZDo6Y291dCA8PCAiVGhpcyBpcyBNYXRyaXhBIiA8PCBzdGQ6OmVuZGw7Cgl9Cn07CgpjbGFzcyBNYXRyaXhCIDogcHVibGljIE1hdHJpeEludGVyZmFjZQp7Cgl2b2lkIGRvU29tZXRoaW5nKCkgY29uc3Qgb3ZlcnJpZGUKCXsKCQlzdGQ6OmNvdXQgPDwgIlRoaXMgaXMgTWF0cml4QiIgPDwgc3RkOjplbmRsOwoJfQp9OwoKY2xhc3MgTWF0cml4QyA6IHB1YmxpYyBNYXRyaXhJbnRlcmZhY2UKewoJdm9pZCBkb1NvbWV0aGluZygpIGNvbnN0IG92ZXJyaWRlCgl7CgkJc3RkOjpjb3V0IDw8ICJUaGlzIGlzIE1hdHJpeEMiIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmludCBtYWluKCkgewoJdXNpbmcgVmVjdG9yVHlwZSA9IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNYXRyaXhJbnRlcmZhY2U+PjsKCVZlY3RvclR5cGUgbWF0cmljaWVzOwoJCgltYXRyaWNpZXMucHVzaF9iYWNrKFZlY3RvclR5cGU6OnZhbHVlX3R5cGUobmV3IE1hdHJpeEEpKTsKCW1hdHJpY2llcy5wdXNoX2JhY2soVmVjdG9yVHlwZTo6dmFsdWVfdHlwZShuZXcgTWF0cml4QikpOwoJbWF0cmljaWVzLnB1c2hfYmFjayhWZWN0b3JUeXBlOjp2YWx1ZV90eXBlKG5ldyBNYXRyaXhDKSk7CgkKCWZvcihhdXRvJiBlbGVtZW50IDogbWF0cmljaWVzKQoJewoJCWVsZW1lbnQtPmRvU29tZXRoaW5nKCk7Cgl9CgkKCXJldHVybiAwOwp9