如果要想使公用基類在衍生類別中只產生一個基類子物件,則必須將這個基類設定為虛基類。
虛基類的引入和說明
前面簡單地介紹了要引進虛基類的原因。實際上,引進虛基類的真正目的是為瞭解決二義性問題。
虛基類說明格式如下:
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();
}