【发布时间】:2014-02-21 11:38:24
【问题描述】:
我在接口、继承和重新定义方面遇到了一些问题。在这种情况下,我不确定为什么 C++ 的行为是这样的,所以如果有人可以解释并帮助我解决这个问题。我有这个课程:
模块.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;
}
};
产品.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)的孩子。可能在main中调用函数bind时,在prod的定义中查找,只找到bind(mixer)? bind(module) 呢?在那种情况下它是私有的吗?
我想要的是,无论我叫什么prod.bind(prod) 或prod.bind(mixer),它都以prod 的级别区分它们,所以我不必从那里调用.in_out。
非常感谢:)
【问题讨论】:
标签: c++ function inheritance parent-child virtual