home *** CD-ROM | disk | FTP | other *** search
- // Pls try the following program on virtual functions and try to do print on
- // most of the code in main(). Almost none of them works !
-
- //
- // The inheritance structure is:
- //
- // V : VA VB
- // A : (V)
- // B : A
- // D : AD (V)
- // C : (V)
- // E : B (V) D C
- //
-
- class VA
- {
- public:
- int va;
- };
-
- class VB
- {
- public:
- int vb;
- int fvb();
- virtual vvb();
- };
-
- class V : public VA, public VB
- {
- public:
- int f();
- virtual vv();
- int w;
- };
-
- class A : virtual public V
- {
- public:
- virtual int f();
- private:
- int a;
- };
-
- class B : public A
- {
- public:
- int f();
- private:
- int b;
- };
-
- class C : public virtual V
- {
- public:
- int c;
- };
-
- class AD
- {
- public:
- virtual int vg() = 0;
- };
-
- class D : public AD, virtual public V
- {
- public:
- static void s();
- virtual int vg();
- virtual int vd();
- int fd();
- int d;
- };
-
- class E : public B, virtual public V, public D, public C
- {
- public:
- int f();
- int vg();
- int vv();
- int e;
- };
-
- D dd;
- D* ppd = ⅆ
- AD* pAd = ⅆ
-
- A a;
- B b;
- C c;
- D d;
- E e;
- V v;
- VB vb;
-
-
- A* pAa = &a;
- A* pAe = &e;
-
- B* pBe = &e;
-
- D* pDd = &d;
- D* pDe = &e;
-
- V* pVa = &a;
- V* pVv = &v;
- V* pVe = &e;
- V* pVd = &d;
-
- AD* pADe = &e;
-
- E* pEe = &e;
-
- VB* pVB = &vb;
-
- void init()
- {
- a.vb = 1;
- b.vb = 2;
- c.vb = 3;
- d.vb = 4;
- e.vb = 5;
- v.vb = 6;
- vb.vb = 7;
-
- d.d = 1;
- e.d = 2;
- }
-
- extern "C" printf(const char *, ...);
-
- int all_count = 0;
- int failed_count = 0;
-
- #define TEST(EXPR, EXPECTED) \
- ret = EXPR; \
- if (ret != EXPECTED) {\
- printf("Failed %s is %d, should be %d!\n", #EXPR, ret, EXPECTED); \
- failed_count++; } \
- all_count++;
-
- int ret;
-
- void test_calls()
- {
- TEST(pAe->f(), 20);
- TEST(pAa->f(), 1);
-
- TEST(pDe->vg(), 202);
- TEST(pADe->vg(), 202);
- TEST(pDd->vg(), 101);
-
- TEST(pEe->vvb(), 411);
-
- TEST(pVB->vvb(), 407);
-
- TEST(pBe->vvb(), 411);
- TEST(pDe->vvb(), 411);
-
- TEST(pEe->vd(), 282);
- TEST(pEe->fvb(), 311);
-
- TEST(pEe->D::vg(), 102);
- printf("Did %d tests, of which %d failed.\n", all_count, failed_count);
- }
-
- main()
- {
-
- init();
-
- e.w = 7;
- e.vb = 11;
-
- test_calls();
- }
-
- int A::f() {return 1;}
- int B::f() {return 2;}
- void D::s() {}
- int E::f() {return 20;}
- int D::vg() {return 100+d;}
- int E::vg() {return 200+d;}
- int V::f() {return 600+w;}
- int V::vv() {return 400+w;}
- int E::vv() {return 450+w;}
- int D::fd() {return 250+d;}
- int D::vd() {return 280+d;}
- int VB::fvb() {return 300+vb;}
- int VB::vvb() {return 400+vb;}
-