在我定义其函数之前,编译器假定子类是虚拟的

问题描述

这是一个示例程序,演示了我在大型程序中遇到的问题。

基本上,我在 .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;
}

有什么办法可以解决这个问题,同时保留 3 个单独的文件

解决方法

一旦一个方法被显式标记为 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!