C++基础知识(二)
2005-01-09 11:41
573 查看
如果要想使公共基类在派生类中只产生一个基类子对象,则必须将这个基类设定为虚基类。
虚基类的引入和说明
前面简单地介绍了要引进虚基类的原因。实际上,引进虚基类的真正目的是为了解决二义性问题。
虚基类说明格式如下:
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();
}
虚基类的引入和说明
前面简单地介绍了要引进虚基类的原因。实际上,引进虚基类的真正目的是为了解决二义性问题。
虚基类说明格式如下:
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();
}
相关文章推荐
- C++入门基础知识
- C++基础知识 day2
- c++之基础知识(2)重载 操作符重载
- C++基础知识: 公有继承,保护继承,私有继承的总结,私有继承的用意何在
- 面试篇之~ c++ 基础知识简单总结 (一)
- C++基础知识(一)—— C++程序结构
- C++基础知识(四)—— 操作符/运算符
- 关于C++程序设计的基础核心之二:继承与派生的基本知识
- C++基础知识总结与回顾--5.5共享数据的保护
- C++基础知识
- C++基础知识3
- C++零碎基础知识点(一)
- C++之基础知识学习笔记
- C++基础知识点总结之常量与引用
- 有关C/C++的一些基础知识
- C++笔记(3):一些C++的基础知识点
- C++基础知识(四)类进阶:抽象类和接口
- 找的c++基础知识
- C++ 基础知识回顾总结
- C++基础知识点遗忘二字符与树的遍历节点判断