多重继承 二义性 问题
- C/C++ code
#include<iostream>#include <string>using namespace std;class Teacher{public: Teacher(string na): name(na){}protected: string name;};class Cadre{public: Cadre(string na): name(na){}protected: string name;};class Teacher_Cadre: public Teacher,public Cadre{public: Teacher_Cadre(string na,double w): Teacher(name),Cadre(name) { wages=w; } void show();private: double wages;};void Teacher_Cadre::show(){ cout<<"name="<<Teacher::name<<endl; /*cout<<"age="<<age<<endl; cout<<"sex="<<sex<<endl; cout<<"address="<<address<<endl; cout<<"callnum="<<callnum<<endl; cout<<"title="<<title<<endl; cout<<"wages="<<wages<<endl;*/ }int main(){ Teacher_Cadre t1("li",5000.0); t1.show(); return 0; }
错误1error C2385: ambiguous access of 'name'
书上只说了 调用show函数会出现二义性 ,可以 初始化现在也出现了 应该怎么解决?
[解决办法]
那个书上,构造函数也是象你这么写的吗?
什么书呀?
[解决办法]
- C/C++ code
Teacher_Cadre(string na,double w): Teacher(name),Cadre(name)
[解决办法]
"inherit.hpp"
class testbase
{
private:
int m_base_data;
public:
testbase(int data);
virtual ~testbase();
void print() const;
};
class test1 : public testbase
{
private:
int m_test1_data;
public:
test1(int basedata, int data);
virtual ~test1();
void print() const;
};
class test2 : public testbase
{
private:
int m_test2_data;
public:
test2(int basedata, int data);
virtual ~test2();
void print() const;
};
class test3 : public test1, public test2
{
private:
int m_test3_data;
public:
test3(int test1_base_data, int test1_data, int test2_base_data, int test2_data, int data);
virtual ~test3();
void print() const;
};
inherit.cpp
#include <iostream>
using namespace std;
#include "inherit.hpp"
testbase::testbase(int data)
{
m_base_data = data;
cout<<"construct class testbase"<<endl;
}
testbase::~testbase()
{
cout<<"destruct class testbase"<<endl;
}
void testbase::print() const
{
cout<<"class testbase data:\t"<<m_base_data<<endl;
}
test1::test1(int basedata, int data):testbase(basedata)
{
m_test1_data = data;
cout<<"construct class test1"<<endl;
}
test1::~test1()
{
cout<<"desturct class test1"<<endl;
}
void test1::print() const
{
testbase::print();
cout<<"class test1 data:\t"<<m_test1_data<<endl;
}
test2::test2(int basedata, int data):testbase(basedata)
{
m_test2_data = data;
cout<<"construct class test2"<<endl;
}
test2::~test2()
{
cout<<"desturct class test2"<<endl;
}
void test2::print() const
{
testbase::print();
cout<<"class test2 data:\t"<<m_test2_data<<endl;
}
test3::test3(int test1_base_data, int test1_data, int test2_base_data, int test2_data, int data)
: test1(test1_base_data, test1_data), test2(test2_base_data, test2_data)
{
m_test3_data = data;
cout<<"construct class test3"<<endl;
}
test3::~test3()
{
cout<<"destruct class test3"<<endl;
}
void test3::print() const
{
test1::print();
test2::print();
cout<<"class test3 data:\t"<<m_test3_data<<endl;
}
int main()
{
test3 *pdata = new test3(1, 2, 3, 4, 5);
test2 *ptest2data = pdata;
test1 *ptest1data = pdata;
testbase *pbasedata = NULL;
cout<<"class test3"<<endl<<endl;
pdata->print();
cout<<"class test2"<<endl<<endl;
ptest2data->print();
cout<<"class test1"<<endl<<endl;
ptest1data->print();
cout<<"class testbase from test2"<<endl<<endl;
pbasedata = ptest2data;
pbasedata->print();
cout<<"class testbase from test1"<<endl<<endl;
pbasedata = ptest1data;
pbasedata->print();
cout<<endl<<endl;
//没有虚拟继承,这里编译不过去
//错误信息:error C2594: '=' : ambiguous conversions from 'class test3 *' to 'class testbase *'
//pbasedata = pdata;
//pbasedata->print();
delete pdata;
return 0;
}
输出结果:
construct class testbase
construct class test1
construct class testbase
construct class test2
construct class test3
class test3
class testbase data: 1
class test1 data: 2
class testbase data: 3
class test2 data: 4
class test3 data: 5
class test2
class testbase data: 3
class test2 data: 4
class test1
class testbase data: 1
class test1 data: 2
class testbase from test2
class testbase data: 3
class testbase from test1
class testbase data: 1
destruct class test3
desturct class test2
destruct class testbase
desturct class test1
destruct class testbase
给你个例子看看吧