C++基础知识(二)

       如果要想使公共基类在派生类中只产生一个基类子对象,则必须将这个基类设定为虚基类。

  虚基类的引入和说明

  前面简单地介绍了要引进虚基类的原因。实际上,引进虚基类的真正目的是为了解决二义性问题。

  虚基类说明格式如下

   virtual <继承方式><基类名>

  其中,virtual是虚类的关键字。虚基类的说明是用在定义派生类时,写在派生类名的后面。

#include "stdafx.h"
#include <iostream.h>

class A
{
   public:
 class B
 {
 public:
  B(int xx)
  {
   this->x=xx;
  }
  void f1();
 private:
  int x;
 };
 void f();
 A(int a):a(a){
  cout<<a<<endl;}
 void print(){cout<<this->a<<endl;}
 private:
  int a;

};
void A::B::f1()
{

 cout<<"B类的私有变量:"<<this->x<<endl;
}
void A::f()
{
 cout<<"A类的私有变量:"<<this->a<<endl;
}
class C:public A
{
public:
 C(int a,int c):A(a){this->c=c;}
 void print();
private:
 int c;
};
void C::print()
{  
 A::print();
 cout<<this->c<<endl;
}
class D:public A
{
public:
 D(int a,int d):A(a){this->d=d;}
    void print(){
  A::print();
  cout<<this->d<<endl;}
private:
 int d;
};
class E:public C,public D
{
public:
 E(int a,int b,int c,int d,int e):C(a,b),D(c,d),e(e){}
 void print();
private:
 int e;
};
void E::print()
{
 C::print();
 D::print();
 cout<<this->e<<endl;
}

class A1:virtual public A//虚基类
{
public:
 A1(int a,int a1):A(a),a1(a1)
 {
  cout<<this->a1<<endl;
 } 
private:
 int a1;
};

class A2:virtual public A
{
public:
 A2(int a,int a2):A(a),a2(a2)
 {
  cout<<this->a2<<endl;
 }
private:
 int a2;
};

class AA:public A1,public A2
{
public:
 AA(int a,int a1,int a2,int aa):A1(a,a1),A2(a,a2),A(a)
 {
   cout<<aa<<endl;
 }
};

void main(void)
{
 printf("嵌套类示例:\n");
 A b1(4);
 b1.f();
 A::B b2(5);
 b2.f1();
 printf("解决二义性问题:\n");
 E e1(1,2,3,4,5);
 e1.print();
 printf("利用虚基类解决二义性问题:\n");
 AA AA1(1,2,3,4);
 //AA1.print();
}

posted @ 2005-01-09 11:41  小白天地  阅读(432)  评论(0)    收藏  举报