⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtable3.h

📁 gcc-you can use this code to learn something about gcc, and inquire further into linux,
💻 H
字号:
// Copyright (C) 2000 Free Software Foundation, Inc.// Contributed by Nathan Sidwell 4 February 2001 <nathan@codesourcery.com>// Check constructor vtables work. This is included from numerous test// files, which set the #defines necessary to specify the heirarchy.#include <typeinfo>#include <stdio.h>int fail;struct A;template <typename BASE, typename DERIVED>int Test (DERIVED *d, int expect){  BASE *b = static_cast <BASE *> (d);  void *full_b = dynamic_cast <void *> (b);  void *full_d = dynamic_cast <void *> (d);  A *ap = static_cast <A *> (b);    if (full_b != full_d)    {      fail++;      fprintf (stderr, "base %s and derived %s have different full objects\n",              typeid (BASE).name (), typeid (DERIVED).name ());      return 1;    }  DERIVED *dynamic_d = dynamic_cast <DERIVED *> (b);    if (dynamic_d != d)    {      fail++;      fprintf (stderr, "dynamic_cast from %s to %s failed\n",              typeid (BASE).name (), typeid (DERIVED).name ());      return 1;    }  b->Baz (static_cast <void *> (ap));    int res = b->Foo (static_cast <void *> (d));    if (res != expect)    {      fail++;      fprintf (stderr, "%s::Foo returned %d, expected %d\n",              typeid (BASE).name (), res, expect);      return 1;    }  return 0;}template <typename T>int Test (T *self, void *expected, int result){  if (self != expected)    {      fail++;      fprintf (stderr, "%s::Foo wrong this pointer\n", typeid (T).name ());    }  return result;}struct A {#ifndef A_EMPTY  int a_m;#endif  virtual int Foo (void *p) {return Test (this, p, 1);}  virtual int Baz (void *p) {return Test (this, p, 1);}  A ();  ~A ();};struct B1: virtual A {#ifndef B1_EMPTY  int b1_m;#endif  virtual int Foo (void *p) {return Test (this, p, 2);}  B1();  ~B1();};struct B2: virtual A {#ifndef B2_EMPTY  int b2_m;#endif  virtual int Foo (void *p) {return Test (this, p, 3);}  B2();  ~B2();};struct Empty {};struct C : C_PARENTS {#ifndef C_EMPTY  int c_m;#endif  virtual int Foo (void *p) {return Test (this, p, 4);}  C();  ~C();};A::A (){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 1);}A::~A (){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 1);}B1::B1(){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 2);  Test <B1> (this, 2);}B1::~B1(){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 2);  Test <B1> (this, 2);}B2::B2(){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 3);  Test <B2> (this, 3);}B2::~B2(){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 3);  Test <B2> (this, 3);}C::C(){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 4);  Test <C> (this, 4);}C::~C(){  fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);  Test <A> (this, 4);  Test <C> (this, 4);}struct D : C {};struct D1 : virtual C {};struct D2 : virtual A, virtual C {};int main(){  {    fprintf (stderr, "C\n");    C c;  }  {    fprintf (stderr, "D\n");    D d;  }  {    fprintf (stderr, "D1\n");    D1 d1;  }  {    fprintf (stderr, "D2\n");    D2 d2;  }  if (fail)    fprintf (stderr, "There are %d failings\n", fail);  else    fprintf (stderr, "Passed\n");  return fail ? 1 : 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -