#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <array>
#include <iomanip>
#include <set>
#include <tuple>
#include <algorithm>
#include <vector>
#include <bitset>
#include <list>
#include <fstream>
#include <memory>
#include <sstream>
#include <chrono>
#include <ctime>
#include <iomanip>
#include <locale>
#include <cstring>
#include <cmath>
#include <complex>
#include <queue>
#include <cstdint>
#include <random>
#include <array>
#include <typeinfo>
#include <thread>
#include <mutex>
#include <cassert>
#include <functional>
#include <atomic>
#include <future>
#include <tuple>
#include <iterator>
#include <unordered_map>
#include <deque>
using namespace std;
class A
{
protected:
int m_X;
public:
A() {
std::cout << "in A ctor" << std::endl;
m_X = 0;
}
virtual void printX(){ std::cout << "in A " << m_X << std::endl; }
};
class B : public A
{
public:
B() {
std::cout << "in B ctor" << std::endl;
m_X = 1;
}
virtual void printX(){ std::cout << "in B " << m_X << std::endl; }
};
class As
{
public:
void AddA( A &a ){ m_As.push_back( std::ref(a) ); }
void PrintXs() const
{
for ( auto a : m_As )
{
a.get().printX();
}
}
private:
std::vector<std::reference_wrapper<A>> m_As;
};
int main()
{
As as;
B b;
as.AddA( b );
as.PrintXs();
system("pause");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxsb2NhbGU+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjb21wbGV4PgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPG11dGV4PgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxhdG9taWM+CiNpbmNsdWRlIDxmdXR1cmU+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPGRlcXVlPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgoKY2xhc3MgQQp7CnByb3RlY3RlZDoKICAgIGludCBtX1g7CnB1YmxpYzoKICAgIEEoKSB7IAogICAgICAgIHN0ZDo6Y291dCA8PCAiaW4gQSBjdG9yIiA8PCBzdGQ6OmVuZGw7IAogICAgICAgIG1fWCA9IDA7CiAgICB9CiAgICB2aXJ0dWFsIHZvaWQgcHJpbnRYKCl7IHN0ZDo6Y291dCA8PCAiaW4gQSAiIDw8IG1fWCA8PCBzdGQ6OmVuZGw7IH0KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQQp7CnB1YmxpYzoKICAgIEIoKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJpbiBCIGN0b3IiIDw8IHN0ZDo6ZW5kbDsgCiAgICAgICAgbV9YID0gMTsKICAgIH0KICAgIHZpcnR1YWwgdm9pZCBwcmludFgoKXsgc3RkOjpjb3V0IDw8ICJpbiBCICIgPDwgbV9YIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKY2xhc3MgQXMKewpwdWJsaWM6CiAgICB2b2lkIEFkZEEoICBBICZhICl7IG1fQXMucHVzaF9iYWNrKCBzdGQ6OnJlZihhKSApOyB9CiAgICB2b2lkIFByaW50WHMoKSBjb25zdAogICAgewogICAgICAgIGZvciAoIGF1dG8gYSA6IG1fQXMgKQogICAgICAgIHsKICAgICAgICAgICAgYS5nZXQoKS5wcmludFgoKTsKICAgICAgICB9CiAgICB9CnByaXZhdGU6CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEE+PiBtX0FzOwp9OwoKaW50IG1haW4oKQp7CiAgICBBcyBhczsKICAgIEIgYjsKICAgIGFzLkFkZEEoIGIgKTsKICAgIGFzLlByaW50WHMoKTsKICAgIHN5c3RlbSgicGF1c2UiKTsKICAgIHJldHVybiAwOwp9