先来对比一下用虚基类和不用虚基类的区别
#include<iostream>
using namespace std;
class Base{
public:
Base(){
a=5;
cout<<"Base a="<<a<<endl;
}
protected:
int a;
};
class Base1:public Base{
public:
Base1(){
a=a+10;
cout<<"Base1 a="<<a<<endl;
}
};
class Base2:public Base{
public:
Base2(){
a=a+20;
cout<<"Base2 a="<<a<<endl;
}
};
class Derived:public Base1,public Base2{
public:
Derived(){
cout<<"Base1::a="<<Base1::a<<endl;
cout<<"Base2::a="<<Base2::a<<endl;//如果不用域操作符,不知道调用谁的a,是Base1还是Base2?
}
};
int main(){
Derived obj;
system("pause");
return 0;
}
结果:
层次结构图:
下面是使用了虚基类的
#include<iostream>
using namespace std;
class Base{
public:
Base(){
a=5;
cout<<"Base a="<<a<<endl;
}
protected:
int a;
};
class Base1:virtual public Base{
public:
Base1(){
a=a+10;
cout<<"Base1 a="<<a<<endl;
}
};
class Base2:virtual public Base{
public:
Base2(){
a=a+20;
cout<<"Base2 a="<<a<<endl;
}
};
class Derived:public Base1,public Base2{
public:
Derived(){
cout<<"Derived a="<<a<<endl;//这里不用使用域操作符,因为虚基类实现了数据共享
}
};
int main(){
Derived obj;
system("pause");
return 0;
}
结果:
层次结构图:
相信你已经知道了虚基类的好处了吧,虚基类实现了共享共同基类的数据
分享到:
相关推荐
19. 虚基类及其作用 6 20. 派生类的构造函数和析构函数的构造规则 7 21. 虚函数及其作用 7 22. 静态关联和动态关联 7 23. 函数重载与虚函数的不同 7 24. 虚析构函数 8 25. 纯虚函数 8 26. 抽象类 8 27. 抽象类与接口...
多态性给我们带来了好处:多态使得我们可以通过基类的引用或指针来指明一个对象(包含其派生类的对象),当调用函数时可以自动判断调用的是哪个对象的函数。一个函数说明为虚函数,表明在继承的类中重载这个函数时,...
1,能使继承基类的子类重写(覆盖)基类定义的相同函数名字和参数的虚函数接口,使子类对象更符合自己的要求或特征 一个简单粗暴的比喻就是 假设人是基类,派生出了子类男人和女人. 则子类男人和女人拥有基类人的相同...
对每一个(除了类CEntity之外)图元类,从其基类中继承了哪些成员,自行定义了哪些成员,其中有哪些成员是对基类相应成员的重写? CEntity::Draw、CEntity::Draw、CEntity::Pick等函数为什么声明为虚函数?...
提供“虚基类”LPLineChartViewLayout定义需要的空方法。在LPLineChartView里用指针指向LPLineChartViewLayout的实例。 在这种设计模式下,UICollectionview基本所有与UI相关的部件全都通过Layout去获取对应的...
1,能使继承基类的子类重写(覆盖)基类定义的相同函数名字和参数的虚函数接口,使子类对象更符合自己的要求或特征一个简单粗暴的比喻就是假设人是基类,派生出了子类男人和女人.则子类男人和女人拥有基类人的相同特征...
<br>主要思路是: <br>提供一个基类CSearchBaseDialog,在基类中,程序从配置文件中读取界面控件的信息,然后根据配置文件中的信息在界面上创建相应的控件。 <br>本文件是...
2-4 使用关键字const而不是#define语句的好处有哪些? 解: const定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的。 2-5 请写出C++语句声明一个常量PI,值为3.1416;再...
2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库...
Override 是进行基类中函数的重写。为了适应需要。 6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程...
好处就很明显,不用我多说了吧。 各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。 这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解 ---...