提问人:J Collins 提问时间:3/12/2014 最后编辑:J Collins 更新时间:3/12/2014 访问量:172
继承、纯虚函数和非内联成员函数定义 [已关闭]
Inheritance, pure virtual functions and non-inline member function definitions [closed]
问:
我已将我的问题归结为以下代码,全部在一个*.cpp文件中:
class A {
public:
A() {};
int PerformAction() {
return Action();
}
protected:
virtual int Action();
}
class B: public A {
protected:
int Action();
}
int B::Action() {
return 4;
}
int main() {
B newB;
newB.PerformAction();
};
前面的代码抛出一个 .将 的定义更改为:Unresolved external symbol error on B::Action()
a::Action()
virtual int Action() = 0;
相反,在 main 函数中使用编译器错误时会产生编译器错误。我看到的所有答案都与将代码分布在多个文件中有关,但这都发生在一个源文件中。我想这与在类定义之外的实现有关,但看不出它会导致任何错误的任何原因。Cannot instantiate abstract class
B
Action()
B
答:
前面的代码在 上抛出 Unresolved external symbol 错误。
B::Action()
事实上,必须定义所有非纯虚函数,以便它们的地址可以存储在类的虚函数表中。
而是产生 Cannot instantiate abstract class compiler 错误
不,它没有:http://ideone.com/IS7PJj
如果你尝试直接实例化,或者一个没有覆盖纯虚函数的子类,你会得到这个错误。 确实覆盖了它,因此不是抽象的。A
B
可能,您的真实类具有不正确的签名,因此它实际上不会覆盖 中声明的签名。在 C++11 中,您可以将说明符添加到 中的说明符,以便在这种情况下获得更有用的错误消息。B
Action
A
override
B
我想这与在类定义之外的实现有关
B
Action()
B
不,这应该不是问题,只要函数只有一个定义。
评论
Indeed, all non-pure virtual functions must be defined, so that their address can be stored in the virtual function table for the class.
而且,更抽象地说,这样就可以调用它们!
总而言之,您的错误消息表明 和 之间的签名不匹配,因此不会成为覆盖。签名必须完全匹配(包括 的 cv-qualification),但允许返回类型协方差。A::Action
B::Action
B::Action
this
并且必须是.如果签名匹配,则为隐式匹配,除非它是模板。模板无法覆盖。B::Action
virtual
如果您有 C++11 编译器,我建议使用 关键字,使签名不匹配成为编译错误。override
评论
main
int
main
A