답변:
먼저 붐 표준 추상 UDT (User-Defined Type)를 사용합니다.
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
UDT를 정의하는 동시에 UDT를 인스턴스화 할 수 있음을 기억하십시오.
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
예제를 결합하고 이름 이 없는 UDT를 정의 할 수 있음을 상기하십시오 .
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
익명 UDT에 대한 증거가 더 이상 필요하지 않으므로 순수한 가상 기능을 잃을 수 있습니다. 또한로 이름 instance을 바꾸면 foo다음과 같이 남습니다.
struct {} foo;
점점 가까이.
이 익명의 UDT가 어떤 기반에서 파생된다면 어떨까요?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
마지막으로, C ++ 11은 확장 된 초기자를 도입 하여 다음과 같은 혼란스러운 작업을 수행 할 수 있습니다.
int x{0};
이:
int x{};
그리고 마지막으로,
struct : bar {} foo {};
이것은 이름없는 구조체로 bar에서 파생되며 빈 이니셜 라이저로 foo로 인스턴스화됩니다.