C:\Users\Admin\Desktop\session\inheritance4.cpp [Warning] direct base 'Batsmen' inaccessible in 'Player' due to ambiguity
C:\Users\Admin\Desktop\session\inheritance4.cpp [Warning] direct base 'Bowler' inaccessible in 'Player' due to ambiguity
C:\Users\Admin\Desktop\session\inheritance4.cpp In member function 'void Player::displayPlayerInfo()':
C:\Users\Admin\Desktop\session\inheritance4.cpp [Error] reference to 'typeOfBatsmen' is ambiguous
C:\Users\Admin\Desktop\session\inheritance4.cpp [Note] candidates are: std::string Batsmen::typeOfBatsmen
C:\Users\Admin\Desktop\session\inheritance4.cpp [Note] std::string Batsmen::typeOfBatsmen
C:\Users\Admin\Desktop\session\inheritance4.cpp [Error] reference to 'typeOfBowler' is ambiguous
C:\Users\Admin\Desktop\session\inheritance4.cpp [Note] candidates are: std::string Bowler::typeOfBowler
C:\Users\Admin\Desktop\session\inheritance4.cpp [Note] std::string Bowler::typeOfBowler
//Hybrid inheritance
#include<iostream>
using namespace std;
class Batsmen
{
protected:
string typeOfBatsmen;
public:
Batsmen()
{
typeOfBatsmen="Unknown";
}
Batsmen(string b)
{
typeOfBatsmen=b;
}
void displayBatsmenInfo()
{
cout<<"Batsmen is "<<typeOfBatsmen<<endl;
}
};
class Bowler
{
protected:
string typeOfBowler;
public:
Bowler()
{
typeOfBowler="Unknown";
}
Bowler(string b)
{
typeOfBowler=b;
}
void displayBowlerInfo()
{
cout<<"Bowler is "<<typeOfBowler<<endl;
}
};
class AllRounders:private Batsmen,private Bowler
{
protected:
string playerType;
public :
AllRounders():Batsmen(),Bowler()
{
playerType="Unknown";
}
AllRounders(string pt, string bts,string bt):Batsmen(bts),Bowler(bt)
{
playerType=pt;
}
void displayAllRounderInfo()
{
cout<<"Player is all rounder"<<endl;
displayBatsmenInfo();
displayBowlerInfo();
}
};
class Player : public Batsmen,public Bowler , protected AllRounders
{
public:
Player():Batsmen(),Bowler(),AllRounders()
{
}
Player(string pt, string bts, string bt): Batsmen(bts),Bowler(bt),AllRounders(pt,bts,bt)
{
}
void displayPlayerInfo()
{
cout<< "Player type "<<endl;
if (playerType=="Batsmen")
cout<< "Batsmen type "<<typeOfBatsmen<<endl;
else if(playerType=="Bowler")
cout<<"Bowler Type :"<<typeOfBowler<<endl;
else
displayAllRounderInfo();
}
};
int main()
{
Player p("Batsmen","Not a Bowler","Right Handed"),p1("All rounder","Right Handed Batsmen","Right hand Medium Fast bowler");
p.displayPlayerInfo();
cout<<""<<endl;
p1.displayPlayerInfo();
return 0;
}
[Error] reference to 'typeOfBatsmen' is ambiguous
[Note] candidates are: std::string Batsmen::typeOfBatsmen
[Note] std::string Batsmen::typeOfBatsmen
In your inheritance tree (top diagram in previous post), typeOfBatsmen can come from either AllRounders or the base class, Batsmen. That is what the word ambiguous in the error message is referring to.
#include<iostream>
using namespace std;
class Batsmen
{
protected:
string typeOfBatsmen;
public:
Batsmen() { typeOfBatsmen = "Unknown"; }
Batsmen(string b) { typeOfBatsmen = b; }
void displayBatsmenInfo() { cout << "Batsmen is " << typeOfBatsmen << endl; }
};
class Bowler
{
protected:
string typeOfBowler;
public:
Bowler() { typeOfBowler = "Unknown"; }
Bowler(string b) { typeOfBowler = b; }
void displayBowlerInfo() { cout << "Bowler is " << typeOfBowler << endl; }
};
class AllRounders :private Batsmen, private Bowler
{
protected:
string playerType;
public:
AllRounders() :Batsmen(), Bowler() { playerType = "Unknown"; }
AllRounders(string pt, string bts, string bt) :Batsmen(bts), Bowler(bt) { playerType = pt; }
void displayBatsmenInfo() { Batsmen::displayBatsmenInfo(); }
void displayBowlerInfo() { Bowler::displayBowlerInfo(); }
void displayAllRounderInfo()
{
cout << "Player is all rounder" << endl;
displayBatsmenInfo();
displayBowlerInfo();
}
};
class Player : /* public Batsmen, public Bowler, */ protected AllRounders
{
public:
Player() : /* Batsmen(), Bowler(), */ AllRounders() { }
Player(string pt, string bts, string bt) : /* Batsmen(bts), Bowler(bt), */ AllRounders(pt, bts, bt) { }
void displayPlayerInfo()
{
cout << "Player type " << endl;
if (playerType == "Batsmen")
displayBatsmenInfo();
// cout << "Batsmen type " << typeOfBatsmen << endl;
else if (playerType == "Bowler")
displayBowlerInfo();
// cout << "Bowler Type :" << typeOfBowler << endl;
else
displayAllRounderInfo();
}
};
int main()
{
Player p("Batsmen", "Not a Bowler", "Right Handed"), p1("All rounder", "Right Handed Batsmen", "Right hand Medium Fast bowler");
p.displayPlayerInfo();
cout << "" << endl;
p1.displayPlayerInfo();
return 0;
}
Output:Player type
Batsmen is Not a Bowler
Player type
Player is all rounder
Batsmen is Right Handed Batsmen
Bowler is Right hand Medium Fast bowler
P.S. - Please use the Code Tag to include blocks of code and error messages - see revised OP.
The string type could be the issue.
Define typeOfBatsmen and typeOfBowler as std::string instead of string.