// 派生类成员函数对基类成员函数的覆盖
#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
};