分享
三行代码  ›  专栏  ›  技术社区  ›  GeorgeT

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

  •  0
  • GeorgeT  · 技术社区  · 6 天前

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

    基本上,我在一个 .h A 是虚拟的,编译器假定子 B .cpp 文件。错误显示:

    候选项是:virtual void B::print()

    但我不希望它是虚拟的。

    示例.h文件:

    class A{   
    public:
        int x;
        A();
        virtual void print();
    };
    
    class B : public A {
    public:
        void print(){};
    };
    

    示例.cpp文件:

    #include "example.h"
    #include <iostream>
    
    using namespace std;
    
    A::A(){ x = 10; }
    
    B::print(){ cout << x << endl; }
    

    主.cpp文件:

    #include "example.h"
    
    using namespace std;
    
    int main()
    {
        B b;
        b.print();
    
        return 0;
    }
    

    有没有办法解决这个问题,同时保持3个独立的文件?

    1 回复  |  直到 6 天前
        1
  •  1
  •   Remy Lebeau    6 天前

    一旦方法被显式标记为 virtual ,即使它没有显式标记为 在那些班级里。这是无法改变的。

    错误的原因是您有两个相互竞争和不兼容的定义 B::print() example.h ,和一个 example.cpp . 您需要从中删除内联定义 :

    class B : public A {
    public:
        void print(); // <-- no braces here!
    };
    

    此外,在 示例.cpp 缺少返回类型:

    void B::print() { cout << x << endl; } // <-- add 'void' here!