проблема виртуального наследования - предупреждение: «Диван» не имеет внешних определений виртуальных методов; его vtable будет генерироваться в каждой единице перевода - PullRequest
0 голосов
/ 25 мая 2020

У меня возникла проблема с виртуальным наследованием, это пример кода для виртуального наследования.

У меня возникла проблема, как показано ниже

предупреждение: «Sofabed» не имеет внешнего виртуального определения методов; его vtable будет генерироваться в каждой единице перевода.

Кровать и диван также получили такое же предупреждение.

Как я могу исправить эту проблему?

Запустите этот пример кода на

  1. Ma c OS 10.14.6
  2. Qt Creator 4.11.1
  3. На основе Qt 5.14.1 (Clang 10.0 (Apple), 64 бит)
#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

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: 
    void sit() { cout << "sit!" << endl; }
    //void ShowWeight() { 
    //    cout << “Sofa weight=” << weight; } 
};

class Bed : virtual public Furniture {
public: 
    void lie() { cout << "lie!" << endl; }
    //void ShowWeight() { 
    //    cout << “Bed weight=” << weight; } 
};

class Sofabed : public Sofa, public Bed {
public: 
    void fold() { cout << "fold!" << endl; }
};


int main() 
{
    Sofabed obj;
    obj.sit();
    obj.lie();
    obj.fold();

    obj.SetWeight(100);
    obj.ShowWeight();

    return 0;   
}

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Как сказано в предупреждении, у вас должна быть по крайней мере одна виртуальная функция, определенная в файле реализации (. 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;
    } 
};

Реализация:

...
Furniture::~Furniture()
{}
...
0 голосов
/ 25 мая 2020

Я поместил весь код в main. cpp. Я попробовал решение alain, но проблема все еще была.

Итак, мне нужно использовать ваше решение, объявить в файле заголовка?

Но я изменил его, как показано ниже, тогда он работает

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; }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...