C++ 虚拟继承问题-警告:';沙发';没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出

C++ 虚拟继承问题-警告:';沙发';没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出,c++,c++11,C++,C++11,我对虚拟继承有一个问题,这是虚拟继承的示例代码 我得到的问题如下 警告:“Sofabed”没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出 床和沙发也受到了同样的警告 我如何解决这个问题 在上运行此示例代码 Mac OS 10.14.6 Qt Creator 4.11.1 基于Qt5.14.1(Clang10.0(Apple),64位) #包括 #包括 #包括 使用名称空间std; 类家具{//公共基类 保护:整数重量; 公众: void SetWeight(inta=0){wei

我对虚拟继承有一个问题,这是虚拟继承的示例代码

我得到的问题如下

警告:“Sofabed”没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出

床和沙发也受到了同样的警告

我如何解决这个问题

在上运行此示例代码

  • Mac OS 10.14.6
  • Qt Creator 4.11.1
  • 基于Qt5.14.1(Clang10.0(Apple),64位)
  • #包括
    #包括
    #包括
    使用名称空间std;
    类家具{//公共基类
    保护:整数重量;
    公众:
    void SetWeight(inta=0){weight=a;}
    int GetWeight(){返回权重;}
    void ShowWeight(){
    
    cout正如警告所说,您应该在实现文件(.cpp)中至少定义一个虚拟函数。由于基类中无论如何都应该有一个虚拟析构函数,因此它是修复此警告的一个很好的候选者:

    标题:

    class Furniture { //common base class
    protected: int weight;
    public: 
        virtual ~Furniture();
        void SetWeight(int a=0) { weight=a; }
        int GetWeight() { return weight; }
        void ShowWeight() { 
            cout << "weight=" << weight << endl;
        } 
    };
    

    我将所有代码都放在main.cpp中。 我尝试了阿兰的解决方案,但仍然存在同样的问题

    所以,我需要使用您的解决方案,在头文件中声明

    但我修改了它如下,然后它的工作

    class Furniture { //common base class
    protected: int weight;
    public:
        void SetWeight(int a=0) { weight=a; }
        int GetWeight() { return weight; }
        void ShowWeight() {
            cout << "weight=" << weight << endl;
        }
    };
    
    class Sofa : virtual public Furniture {
    public:
        virtual ~Sofa();
        void sit() { cout << "sit!" << endl; }
        //void ShowWeight() {
        //    cout << “Sofa weight=” << weight; }
    };
    
    class Bed : virtual public Furniture {
    public:
        virtual ~Bed();
        void lie() { cout << "lie!" << endl; }
        //void ShowWeight() {
        //    cout << “Bed weight=” << weight; }
    };
    
    class Sofabed : public Sofa, public Bed {
    public:
        virtual ~Sofabed();
        void fold() { cout << "fold!" << endl; }
    };
    
    class家具{//公共基类
    保护:整数重量;
    公众:
    void SetWeight(inta=0){weight=a;}
    int GetWeight(){返回权重;}
    void ShowWeight(){
    
    cout在
    #include
    块之后,添加
    命名空间{
    ,在
    main
    之前添加结束
    }
    。永远不要使用命名空间std;
    …使用
    ,如果基类
    家具
    不应该是可实例化的,可以通过使析构函数纯虚拟
    虚拟~Furniture()=0;
    (但将默认实现保留在
    .cpp
    文件中)使其抽象化。
    ...
    Furniture::~Furniture()
    {}
    ...
    
    class Furniture { //common base class
    protected: int weight;
    public:
        void SetWeight(int a=0) { weight=a; }
        int GetWeight() { return weight; }
        void ShowWeight() {
            cout << "weight=" << weight << endl;
        }
    };
    
    class Sofa : virtual public Furniture {
    public:
        virtual ~Sofa();
        void sit() { cout << "sit!" << endl; }
        //void ShowWeight() {
        //    cout << “Sofa weight=” << weight; }
    };
    
    class Bed : virtual public Furniture {
    public:
        virtual ~Bed();
        void lie() { cout << "lie!" << endl; }
        //void ShowWeight() {
        //    cout << “Bed weight=” << weight; }
    };
    
    class Sofabed : public Sofa, public Bed {
    public:
        virtual ~Sofabed();
        void fold() { cout << "fold!" << endl; }
    };