多重继承和虚基类
来源:互联网 发布:下载超牛数据恢复软件 编辑:程序博客网 时间:2024/05/17 23:21
//派生类成员函数对基类成员函数的覆盖
#include "stdafx.h"
#include<iostream>
class A
{
public:
void Show()
{
std::cout<<"A::Show/n";
}
};
class B:public A
{
public:
void Show()
{
std::cout<<"B::Show/n";
}
void Display()
{
Show();//调用派生类B的成员函数,覆盖掉继承自基类的Show()成员方法
A::Show();//调用基类A的成员函数
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
a.Show();
b.Show();
b.Display();
std::cin.get();
return 0;
}
程序运行的结果:
A::Show
B::Show
B::Show
A::Show
一个派生类对象含有基类的数据成员的一个副本,在C++类的多重继承结构中,由于多层次的交叉派生关系,一个派生类中可能保留某个基类的多个实例。例如,在下图中,B:A,C:A,D:B,D:C,这是在派生类D的对象中存在间接基类A的两份副本。当试图通过派生类对象直接访问基类A中的成员是,将会导致编译二义性错误。
//多重继承的副本二义性
class A
{
public:
int a;//a
};
class B:public A
{
public:
int b;//a,b
};
class C:public A
{
public:
int c;//a,c
};
class D:public B,public C
{
public:
int d;//(a,b),(a,c),d
};
int _tmain(int argc, _TCHAR* argv[])
{
D d1;
d1.a=100;//此处a具有二义性,编译器无法确定a是那个副本
d1.B::a=100;//指明访问的是通过B类间接派生的
d1.C::a=100;//指明访问的是通过C类间接派生的
return 0;
}
编译结果:error C2385: ambiguous access of 'a'
若注释掉d1.a=100;则编译通过。
在多重继承中,C++提供了虚基类(virtual base class)来解决二义性的问题。虚基类只是一种派生的方式,类层次结构中某个虚基类成员只出现一次,即基类的一个副本被所有派生类对象共享。修改上例代码中B,C的派生方式则d1.a=100;是合法的。
class B:public virtual A
{
public:
int b;//a,b
};
class C:public virtual A
{
public:
int c;//a,c
};
- 多重继承和虚基类
- 多重继承和虚基类
- 多重继承和虚基类
- 虚基类和多重继承总结
- C++虚基类详解 和 多重继承
- C++虚基类详解 和 多重继承
- 多重继承和虚拟继承
- 多重继承和虚继承
- 多重继承和虚继承
- 多继承和多重继承
- 多重继承和接口
- 多重继承和 templates
- 多重继承、钻石继承和虚继承
- 多重继承,钻石继承和虚继承
- 多重继承与虚基类
- 多重继承虚基类大小
- 多重继承 与 虚基类
- 虚基类与多重继承
- C# 设计模式学习二 Singleton单例模式
- [动态规划]Pku1390 Blocks
- 批处理运行多个程序的方法/如何写批处理运行程序
- Mathtype输入Latex模式公
- ビジネス文書ー挨拶状
- 多重继承和虚基类
- 敬语和谦语
- 书信-例子
- 纪念第一次发技术铁 拉回来瞧瞧 关于int 9
- 商务文书范例——邀请函、请柬
- 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer)
- 封闭归来
- 基于JavaScript的水平导航动态下拉菜单
- FTP如何使用二进制上传