继承、纯虚函数和非内联成员函数定义
Inheritance, pure virtual functions and non-inline member function definitions
我把我的问题归结为以下代码,全部在一个*.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
的类定义之外有关,但我看不出它为什么会导致任何错误。
您的错误消息,放在一起,表明A::Action
和B::Action
之间的签名不匹配,这样B::Action
不会成为覆盖。签名必须完全匹配(包括this
的cv-qualification),除了允许返回类型协方差。
且B::Action
必须为virtual
。如果签名匹配,它将是隐式的,除非它是模板。模板不能重写。
如果您有c++ 11编译器,我建议使用override
关键字,使签名不匹配成为编译错误。
前面的代码在
B::Action()
上抛出了一个未解决的外部符号错误。
实际上,必须定义所有非纯虚函数,以便将它们的地址存储在该类的虚函数表中。
产生不能实例化抽象类编译器错误
不,它没有:http://ideone.com/IS7PJj
如果你试图直接实例化A
,或者一个没有覆盖纯虚函数的子类,你会得到这个错误。B
不覆盖它,所以不是抽象的。
可能,你真正的类B
对Action
有一个不正确的签名,所以它实际上并没有覆盖在A
中声明的那个。在c++ 11中,您可以将override
说明符添加到B
中,以在这种情况下获得更有用的错误信息。
我想这与
B
的Action()
的实现在B
的类定义之外有关
不,这应该不是问题,只要函数只有一个定义。
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针