【发布时间】:2019-07-22 00:29:48
【问题描述】:
以下代码有效:
class Test_Interface {
public:
template<typename... Args>
void Split(int weight, Args... args){
Split(weight);
Split(args...);
}
virtual void Split(int weight) {
std::cout << "Test_Interface::Split weight: " << weight << std::endl;
};
};
class Test : public Test_Interface {};
int main()
{
Test test;
test.Split(1, 20, 300);
}
但如果我在 Test 类中为方法 Split 定义重载,例如:
class Test : public Test_Interface {
public:
virtual void Split(int weight) {
std::cout << "Test::Split weight: " << weight << std::endl;
};
};
然后我得到如下错误:error: no matching function for call to 'Test::Split(int, int, int)'
我知道如果我也在类 Test 中定义可变参数方法,例如:
class Test : public Test_Interface {
public:
template<typename... Args>
void Split(int weight, Args... args){
Split(weight);
Split(args...);
}
virtual void Split(int weight) {
std::cout << "Test::Split weight: " << weight << std::endl;
};
};
它再次工作,但它并没有做最初打算做的事情,它只有一个地方(接口)定义可变参数方法,并且每个派生类仅具有非可变参数方法的自定义实现.我的目标是避免一遍又一遍地复制粘贴相同的代码并在多个地方维护它。为什么子类不重载方法继承工作?有没有办法不用复制粘贴?谢谢
【问题讨论】:
-
请注意,该问题与可变参数模板完全无关。参见,例如:wandbox.org/permlink/RlmOGw27cghoubxB.
-
@DanielLangr 好点,谢谢
标签: c++ inheritance variadic-functions