У меня возникли проблемы с интерфейсами, наследованием и переопределением. В этом случае я не уверен, почему именно C++ ведет себя так, поэтому, если кто-то может объяснить и помочь мне с этим. У меня есть эти классы:C++: наследование функций и их переопределение
module.h:
class mixer;
class module {
public:
module(std::string name_) : name(name_) {}
~module() {}
virtual module& bind(module &mod) = 0;
virtual module& bind(mixer &mix) { return ((module&)mix); }
std::string get_name()
{
return name;
}
std::string name;
};
in_out.h:
class in_out : public module {
public:
in_out(std::string name_) : module(name_) {}
~in_out() {}
virtual module& bind(module &mod)
{
std::cout << "bind in_out in " << mod.name << std::endl;
return mod;
}
};
prod.h:
class prod : public in_out {
public:
prod(std::string name_)
: in_out(name_)
{}
~prod() {}
virtual module& bind(mixer &mix)
{
std::cout << "bind mixer in " << get_name() << std::endl;
return mix;
}
};
mixer.h:
class mixer : public in_out {
public:
mixer(std::string name_)
: in_out(name_)
{}
~mixer() {}
};
Так, если в моем главном файле у меня есть это:
int main(int argc, char *argv[])
{
prod prod1("prod1");
prod prod2("prod2");
mixer mixer1("mixer1");
mixer mixer2("mixer2");
prod1.bind(prod2);
return 0;
}
я получаю эту ошибку:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:12:19: error: no matching function for call to ‘prod::bind(prod&)’
main.cpp:12:19: note: candidate is:
prod.h:19:23: note: virtual pfn_module& prod::bind(mixer&)
prod.h:19:23: note: no known conversion for argument 1 from ‘prod’ to ‘mixer&’
make: *** [main] Error 1
Если я вместо этого:
prod1.in_out::bind(prod2);
Он работает, как ожидалось.
Что я не понимаю, разве компилятор не различает их?
virtual module& bind(module &mod) = 0;
// and
virtual module& bind(mixer &mix) { return ((module&)mix); }
Я думаю, что проблема может быть, что оба mixer
и prod
являются потомком module
(и in_out
). Может быть, когда функция bind
вызывается в основном, она ищет ее в определении prod
и находит только bind(mixer)
? Как насчет bind(module)
? Является ли он конфиденциальным в этом контексте?
То, что я хотел бы иметь, независимо от того, что я называю prod.bind(prod)
или prod.bind(mixer)
, это отличает их prod
«s уровне, так что я не должен позвонить .in_out
оттуда.
Большое спасибо :)
также деструкторы базовых классов виртуальными. –
@Alex Вы правы. Спасибо, я добавлю свой пост. –
Хорошо. Делает много смысла :) Но я получаю эту ошибку: 'error: 'virtual module & in_out :: bind (module &)' isaccessible' – makeMonday