我想知道是否可以通过以下方式覆盖方法:
#include <iostream>
#include <tuple>
template<typename P, typename ...Keys>
class Object {
public:
void method1(P p, Keys... keys) {
method2(std::make_tuple(keys...), p);
}
void method2(const std::tuple<Keys...> my_tuple, int id) {
printf("Hello1!");
}
};
class MyObject : public Object<int, char, char> {
public:
void method2(const std::tuple<int, char> my_tuple, int id) {
printf("Hello2!");
}
};
int main(int argc, char *argv[]) {
MyObject obj;
int a = 13;
obj.method1(a, 'a', 'c'); // prints Hello1! and not Hello2!
}
此代码打印'Hello1'。我想要它打印'Hello2'。
如果我将method2改为
abstract void method2(const std::tuple<Keys...> my_tuple, int id) = 0;
我收到以下错误:
错误:无法将变量'obj'声明为抽象类型'MyObject'obj;
main.cpp:16:7:注意:因为以下虚函数在'MyObject'中是纯粹的:
在MyObject中覆盖method2的正确方法是什么?
最佳, Moritz的
答案 0 :(得分:1)
问题在于MyObject
来自Object<int, char, char>
,这意味着P=char
和Keys=<char, char>
,但您使用method2
覆盖Keys=<int, char>
。要么从Object<int, int, char>
派生,要么更改MyObject::method2
以取tuple<char, char>
。
你还需要method2
是虚拟的,正如你已经尝试过的那样。通过上述修复,它不会再导致“无法声明”错误。