由于两义性问题的根源在公共基类,因此需要从公共基类着手,将公共基类说明为虚基类,就可以避免二义性。代码如下:
#include<iostream>
using namespace std;
class human
{
public:
void speak(){cout<<"人类可以说话"<<endl;}
};
class father : virtual public human
{
public:
void stand(){cout<<"父亲可以站立"<<endl;}
};
class mother : virtual public human
{
public:
void clean(){cout<<"母亲可以洗衣服"<<endl;}
};
class son : public father ,public mother
{
public:
void school(){cout<<"孩子还在上学"<<endl;}
};
int main()
{
son Tom;
Tom.stand();
father *fp = NULL;
fp = new son;
fp->speak();
//fp->school();
/*son *Fs = NULL;
Fs = new father;*/
/*用基类指针指向一个派生类对象时,由于派生类对象也是基类的对象,因此这种指向是安全的,但只能访问基类所
拥有的成员*/
return 0;
}
注意:一、father 和mother在继承时将human说明为虚基类,也就是只为子类son生成一个speak函数,speak函数是惟一的,避免了二义性。
二、派生类指针不能直接指向基类对象。
三、派生类指针必须强制转换成基类指针后才可指向基类。
谢谢大家!祝大家心情愉快。
PS:我的第一篇博文。