我在接口,继承和重定义方面遇到了一些问题。在这种情况下,我不确定为什么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
在main中被调用时,它会在prod
的定义中寻找它,并且只能找到bind(mixer)
?那么bind(module)
?在这种情况下它是私密的吗?
我想吃点什么的,不管是什么我打电话prod.bind(prod)
或prod.bind(mixer)
,它在prod
的水平区分开来,所以我没有打电话给.in_out
从那里。
感谢很多:)
也做了基类的析构函数是虚拟的。 –
@Alex你说得对。谢谢,我会追加我的文章。 –
好的。使得很多SENCE的:)但我发现了这个错误: '错误:“虚拟模块和IN_OUT ::绑定(模块&)”是inaccessible' – makeMonday