问题描述
这是一个示例程序,演示了我在大型程序中遇到的问题。
基本上,我在 .h
文件中有父类和子类的声明。因为父类 A
是虚拟的,编译器假定子类 B
也是虚拟的,不会让我在 .cpp
文件中定义它的函数。错误说:
候选对象是:virtual void B::print()
但我不希望它是虚拟的。
example.h 文件:
class A{
public:
int x;
A();
virtual void print();
};
class B : public A {
public:
void print(){};
};
example.cpp 文件:
#include "example.h"
#include <iostream>
using namespace std;
A::A(){ x = 10; }
B::print(){ cout << x << endl; }
main.cpp 文件:
#include "example.h"
using namespace std;
int main()
{
B b;
b.print();
return 0;
}
解决方法
一旦一个方法被显式标记为 virtual
,它在派生类中总是虚拟的,即使它在那些类中没有显式标记为 virtual
。没有办法改变这一点。
出现错误的原因是您对 B::print()
有 2 个相互竞争且不兼容的定义 - 一个在 example.h
中内联,另一个在 example.cpp
中。您需要从 example.h
:
class B : public A {
public:
void print(); // <-- no braces here!
};
此外,example.cpp
中的定义缺少返回类型:
void B::print() { cout << x << endl; } // <-- add 'void' here!