Я довольно новичок в C++, и мне нужно прояснить перенос проекта с Java.Полиморфный подтипирование в C++
В Java я могу объявить базовый класс и его производным, с обобщениями, таким образом:
public class GenericHost{
public enum HostType{
server,
client
}
public HostType type_;
}
public class MyClient extends GenericHost{
public String clientName;
}
public class MyServer extends GenericHost{
public String serverName;
}
public abstract class GenericNetwork<hostType extends GenericHost> {
public enum NetworkType{
central,
peripheral
}
private NetworkType type_;
protected hostType masterHost;
public hostType getMasterHost(){
return masterHost;
}
public abstract String getName();
}
public class CentralNetwork extends GenericNetwork<MyServer>{
@Override
public String getName(){
return masterHost.serverName;
}
}
public class PeripheralNetwork extends GenericNetwork<MyClient>{
@Override
public String getName(){
return masterHost.clientName;
}
}
Это позволяет мне:
В производных классах I» m разрешено использовать методы и переменные указанного производного класса (например,
serverName
/clientName
вCentralNetwork
/PeripheralNetwork
), а не только базового классапроизводный класс tiped, поэтому компилятор/редактор может предложить мне каждый метод & переменный во время кода редактирования
Я вынужден использовать класс, который является производным от базового класса (
GenericNetwork
/GenericHost
) , каждая ошибка находится во время компиляции и не выполняется.Каждый метод/переменная, использующая общие элементы, будет обрабатываться в производном классе как дочерний класс, а не базовый класс (например, в
CentralNetwork
,getMasterHost
вернет производныеMyServer
, а не базуGenericHost
).
Я хочу знать, существует ли что-либо подобное в C++. Я уже искал шаблоны, наследование и подтипирование, но я не могу найти способ сделать что-то умнее, чем в Java. Я надеюсь, что я что-то пропустил ...
EDIT: Это то, что я пытался в C++:
class GenericHost{
public enum HostType{
server,
client
}
public HostType type_;
}
class MyClient : public GenericHost{
public String clientName;
}
class MyServer : public GenericHost{
public String serverName;
}
template<class hostType : GenericHost> <--WISH, forced base class
class GenericNetwork {
public enum NetworkType{
central,
peripheral
}
private NetworkType type_;
protected hostType masterHost;
public hostType getMasterHost(){
return masterHost; <--WISH, should return MyServer/Myclient in derived class
}
public virtual std::string getName();
}
class CentralNetwork<MyServer> : public GenericNetwork{
public std::string getName(){
return masterHost.serverName; <--WISH, tiped and suggested by editor/compiler
}
}
class PeripheralNetwork<MyClient>: public GenericNetwork{
public std::string getName(){
return masterHost.clientName; <--WISH, tiped and suggested by editor/compiler
}
}
Я не имею проект C со мной, так что я переписал его на лету, извините за любую ошибку ...
Можете ли вы показать нам, что вы пробовали в C++ (с шаблонами)? – dyp
Пожалуйста, добавьте все строки в блок кода с четырьмя пробелами или выберите его и нажмите Ctrl + K, чтобы получить правильное форматирование. http://stackoverflow.com/help/formatting – dyp
@dyp done, извините, мой первый пост ... – SilverHawk