İlk olarak, bir bataklık standardı soyut UDT (Kullanıcı Tanımlı Tip) alacağız:
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
UDT'yi tanımladığımız zamanda başlatabildiğimizi de hatırlayalım:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Örnekleri birleştirelim ve adı olmayan bir UDT tanımlayabileceğimizi hatırlayalım :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Artık anonim UDT ile ilgili kanıtlara ihtiyacımız yok, bu yüzden saf sanal işlevi kaybedebiliriz. Ayrıca yeniden adlandırılması instance
için foo
, biz kalacaksın:
struct {} foo;
Yakınlaşmak.
Şimdi, bu anonim UDT bir bazdan türetilseydi?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Son olarak, C ++ 11 , bu gibi kafa karıştırıcı şeyler yapabilmemiz için genişletilmiş başlatıcılar sunar :
int x{0};
Ve bu:
int x{};
Ve son olarak, bu:
struct : bar {} foo {};
Bu, boş bir başlatıcı ile foo olarak başlatılan, çubuktan türeyen isimsiz bir yapıdır.