- #include <iostream>
- class VirtualBase
- {
- public:
- virtual const char* str() {
- return "VirtualBase";
- }
- };
- class VirtualDerived1 : public VirtualBase
- {
- public:
- virtual const char* str() {
- return "VirtualDerived1";
- }
- };
- class VirtualDerived2 : public VirtualBase
- {
- public:
- virtual const char* str() {
- return "VirtualDerived2";
- }
- };
- class NonVirtualBase
- {
- static const char* NonVirtualBase_str()
- {
- return "NonVirtualBase";
- }
- protected:
- const char* (*const vstr)() ;
- NonVirtualBase(const char* (*const vstr)()) : vstr(vstr) {}
- public:
- NonVirtualBase() : vstr(NonVirtualBase_str)
- {
- }
- const char* str()
- {
- return vstr();
- }
- };
- class NonVirtualDerived1 : public NonVirtualBase
- {
- static const char* NonVirtualDerived1_str()
- {
- return "NonVirtualDerived1";
- }
- public:
- NonVirtualDerived1() : NonVirtualBase(NonVirtualDerived1_str) {}
- };
- class NonVirtualDerived2 : public NonVirtualBase
- {
- static const char* NonVirtualDerived2_str()
- {
- return "NonVirtualDerived2";
- }
- public:
- NonVirtualDerived2() : NonVirtualBase(NonVirtualDerived2_str) {}
- };
- int main()
- {
- VirtualBase* ptr[3];
- ptr[0] = new VirtualBase();
- ptr[1] = new VirtualDerived1();
- ptr[2] = new VirtualDerived2();
- for (int i = 0; i < 3; i++)
- {
- std::cout << ptr[i]->str() << std::endl;
- delete ptr[i];
- }
- NonVirtualBase* vptr[3];
- vptr[0] = new NonVirtualBase();
- vptr[1] = new NonVirtualDerived1();
- vptr[2] = new NonVirtualDerived2();
- for (int i = 0; i < 3; i++)
- {
- std::cout << vptr[i]->str() << std::endl;
- delete vptr[i];
- }
- return 0;
- }
or..
- #include <functional>
- class NonVirtualBase
- {
- protected:
- NonVirtualBase(std::function<const char*()>&& v_str) : str(v_str) {}
- public:
- const std::function<const char*()> str;
- NonVirtualBase() : str([]() -> const char* { return "NonVirtualBase"; })
- {
- }
- };
- class NonVirtualDerived1 : public NonVirtualBase
- {
- public:
- NonVirtualDerived1() : NonVirtualBase([]()-> const char* {return "NonVirtualDerived1"; }) {}
- };
- class NonVirtualDerived2 : public NonVirtualBase
- {
- public:
- NonVirtualDerived2() : NonVirtualBase([]()-> const char* {return "NonVirtualDerived2"; }) {}
- };
아침 수업 듣다가 졸려서 장난질 쳐본 것입니다
댓글 0