#include <iostream>
#include <vector>
class base
{
public:
base (int a, int b): a(a), b(b) {};
~base () {};
virtual int act() {return 0;}
protected:
int a;
int b;
};
class derivedAdd: public base
{
public:
derivedAdd (): base(15,5) {};
derivedAdd (int a, int b): base(a,b) {};
~derivedAdd () {};
int act() {return (*this).base::a + (*this).base::b;}
operator int() {return (*this).base::a;}
};
class derivedSubtract: public base
{
public:
derivedSubtract (int a, int b): base(a,b) {};
~derivedSubtract () {};
int act() {return (*this).base::a - (*this).base::b;}
};
class derivedMultiply: public base
{
public:
derivedMultiply (int a, int b): base(a,b) {};
~derivedMultiply () {};
int act() {return ((*this).base::a) * ((*this).base::b);}
};
class derivedDivide: public base
{
public:
derivedDivide (int a, int b): base(a,b) {};
~derivedDivide () {};
int act() {return ((*this).base::a) / ((*this).base::b);}
};
int main()
{
int a=40, b=8;
base* thePointer=0;
std::vector <base*> ptrVector(4);
for (int i=0; i<4; i++)
{
switch (i)
{
case 0: thePointer = new derivedAdd(a, b);
break;
case 1: thePointer = new derivedSubtract(a, b);
break;
case 2: thePointer = new derivedMultiply(a, b);
break;
case 3: thePointer = new derivedDivide(a, b);
break;
default: std::cout << "Error" << std::endl;
break;
}
ptrVector[i] = thePointer;
}
for (unsigned int i=0; i<ptrVector.size(); i++)
{
std::cout << "ptrVector[" << i << "]->act()= " << ptrVector[i]->act() << std::endl;
std::cout << "ptrVector[" << i << "]= " << ptrVector[i] << std::endl;
}
std::cout << std::endl;
std::cout << "ptrVector= " << ptrVector << std::endl;
std::vector <int> intVector(4,8);
std::cout << "intVector= " << intVector << std::endl;
std::vector <derivedAdd> derivedVector(4);
//std::cout << "derivedVector= " << derivedVector << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKCmNsYXNzIGJhc2UKewogICAgcHVibGljOgoJCWJhc2UgKGludCBhLCBpbnQgYik6IGEoYSksIGIoYikge307CgkJfmJhc2UgKCkge307CgoJCXZpcnR1YWwgaW50IGFjdCgpIHtyZXR1cm4gMDt9CgoJcHJvdGVjdGVkOgoJCWludCBhOwoJCWludCBiOwoKCn07CgoKY2xhc3MgZGVyaXZlZEFkZDogcHVibGljIGJhc2UKewkKCXB1YmxpYzoKCQlkZXJpdmVkQWRkICgpOiBiYXNlKDE1LDUpIHt9OwoJCWRlcml2ZWRBZGQgKGludCBhLCBpbnQgYik6IGJhc2UoYSxiKSB7fTsKCQl+ZGVyaXZlZEFkZCAoKSB7fTsKCQoJCWludCBhY3QoKSB7cmV0dXJuICgqdGhpcykuYmFzZTo6YSArICgqdGhpcykuYmFzZTo6Yjt9CgoJCW9wZXJhdG9yIGludCgpIHtyZXR1cm4gKCp0aGlzKS5iYXNlOjphO30KfTsKCmNsYXNzIGRlcml2ZWRTdWJ0cmFjdDogcHVibGljIGJhc2UKewkKCXB1YmxpYzoKCQlkZXJpdmVkU3VidHJhY3QgKGludCBhLCBpbnQgYik6IGJhc2UoYSxiKSB7fTsKCQl+ZGVyaXZlZFN1YnRyYWN0ICgpIHt9OwoJCgkJaW50IGFjdCgpIHtyZXR1cm4gKCp0aGlzKS5iYXNlOjphIC0gKCp0aGlzKS5iYXNlOjpiO30KfTsKCmNsYXNzIGRlcml2ZWRNdWx0aXBseTogcHVibGljIGJhc2UKewkKCXB1YmxpYzoKCQlkZXJpdmVkTXVsdGlwbHkgKGludCBhLCBpbnQgYik6IGJhc2UoYSxiKSB7fTsKCQl+ZGVyaXZlZE11bHRpcGx5ICgpIHt9OwoJCgkJaW50IGFjdCgpIHtyZXR1cm4gKCgqdGhpcykuYmFzZTo6YSkgKiAoKCp0aGlzKS5iYXNlOjpiKTt9Cn07CgpjbGFzcyBkZXJpdmVkRGl2aWRlOiBwdWJsaWMgYmFzZQp7CQoJcHVibGljOgoJCWRlcml2ZWREaXZpZGUgKGludCBhLCBpbnQgYik6IGJhc2UoYSxiKSB7fTsKCQl+ZGVyaXZlZERpdmlkZSAoKSB7fTsKCQoJCWludCBhY3QoKSB7cmV0dXJuICgoKnRoaXMpLmJhc2U6OmEpIC8gKCgqdGhpcykuYmFzZTo6Yik7fQp9OwoKCmludCBtYWluKCkKewoKCWludCBhPTQwLCBiPTg7CgoJYmFzZSogdGhlUG9pbnRlcj0wOwoKCXN0ZDo6dmVjdG9yIDxiYXNlKj4gcHRyVmVjdG9yKDQpOwoKCWZvciAoaW50IGk9MDsgaTw0OyBpKyspCgl7CgkJc3dpdGNoIChpKQoJCXsKCQkJY2FzZSAwOiB0aGVQb2ludGVyID0gbmV3IGRlcml2ZWRBZGQoYSwgYik7CgkJCQlicmVhazsKCgkJCWNhc2UgMTogdGhlUG9pbnRlciA9IG5ldyBkZXJpdmVkU3VidHJhY3QoYSwgYik7CQoJCQkJYnJlYWs7CgoJCQljYXNlIDI6IHRoZVBvaW50ZXIgPSBuZXcgZGVyaXZlZE11bHRpcGx5KGEsIGIpOwkKCQkJCWJyZWFrOwoKCQkJY2FzZSAzOiB0aGVQb2ludGVyID0gbmV3IGRlcml2ZWREaXZpZGUoYSwgYik7CQoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OiBzdGQ6OmNvdXQgPDwgIkVycm9yIiA8PCBzdGQ6OmVuZGw7CgkJCQlicmVhazsKCQl9CgoJCXB0clZlY3RvcltpXSA9IHRoZVBvaW50ZXI7Cgl9CgkKCglmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8cHRyVmVjdG9yLnNpemUoKTsgaSsrKQoJewoJCXN0ZDo6Y291dCA8PCAicHRyVmVjdG9yWyIgPDwgaSA8PCAiXS0+YWN0KCk9ICIgPDwgcHRyVmVjdG9yW2ldLT5hY3QoKSA8PCBzdGQ6OmVuZGw7CgkJc3RkOjpjb3V0IDw8ICJwdHJWZWN0b3JbIiA8PCBpIDw8ICJdPSAiIDw8IHB0clZlY3RvcltpXSA8PCBzdGQ6OmVuZGw7Cgl9CgoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCglzdGQ6OmNvdXQgPDwgInB0clZlY3Rvcj0gIiA8PCBwdHJWZWN0b3IgPDwgc3RkOjplbmRsOwoKCXN0ZDo6dmVjdG9yIDxpbnQ+IGludFZlY3Rvcig0LDgpOwoJc3RkOjpjb3V0IDw8ICJpbnRWZWN0b3I9ICIgPDwgaW50VmVjdG9yIDw8IHN0ZDo6ZW5kbDsKCglzdGQ6OnZlY3RvciA8ZGVyaXZlZEFkZD4gZGVyaXZlZFZlY3Rvcig0KTsKCS8vc3RkOjpjb3V0IDw8ICJkZXJpdmVkVmVjdG9yPSAiIDw8IGRlcml2ZWRWZWN0b3IgPDwgc3RkOjplbmRsOwoJCgp9Cg==
prog.cpp: In function ‘int main()’:
prog.cpp:102:32: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
In file included from /usr/include/c++/4.7/iostream:40:0,
from prog.cpp:1:
/usr/include/c++/4.7/ostream:600:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::vector<base*>]’
prog.cpp:105:32: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
In file included from /usr/include/c++/4.7/iostream:40:0,
from prog.cpp:1:
/usr/include/c++/4.7/ostream:600:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::vector<int>]’