我在头文件
中有两个类如下template<size_t N>
class Parent{
protected:
char array[N];
size_t i;
public:
virtual void operator()(int i);
};
template<size_t N>
void Parent<N>::operator()(int i){
this->i = i;
}
class Child: public Parent<16>{
public:
virtual void operator()();
};
Child在cpp文件的其他地方定义了operator()()。每当我从另一个cpp文件中包含这个头文件时,我都可以访问operator()(),但是甚至没有定义operator()(int)。为什么是这样?我想,因为我从Parent的特定实例继承,所以它的所有方法都应该实例化并可用。
答案 0 :(得分:2)
除了代码中的错误之外,这是隐藏的示例:您的派生类声明了一个同名但具有不同签名的函数作为基类。因此基本函数是隐藏:
class A { virtual void foo(); };
class B : public A { virtual void foo(int); /* hides A::foo() ! */ };
继承只影响具有相同签名的函数(有一些温和的例外)。
您的基类函数声明为void Parent<N>::operator()(int)
,而在派生类中,您声明void Child::operator()()
。
在C ++ 11中,如果函数没有覆盖任何内容,你可以明确地说virtual void foo(int) override
来触发编译器错误。
如果您有意想要定义一个与现有函数同名但具有不同签名的新函数,而不是覆盖基函数,那么您可以使用using
指令使基函数可见:< / p>
class C : public A
{
using A::foo();
void foo(int);
}; // now have both C::foo(int) and C::foo()
答案 1 :(得分:0)
因为Parent的运算符()隐藏了Child的运算符()(它们具有不同的签名)。为什么编译代码时没有收到警告?
应该是这样的:
class Child: public Parent<16>{
public:
using Parent<16>::operator();
virtual void operator()();
};