1. ホーム
  2. c++

[解決済み] コンストラクタの `vtable' への参照が未定義である [重複] 。

2022-03-12 03:17:28

質問

C++のコンストラクタを勉強しようと思っているのですが、まだ初心者です。次のクラスは私が書きました。
screen.h

#ifndef SCREEN_H
#define SCREEN_H

#include "pch.h"

class Screen
{
public:
    Screen(const std::string& name);
    Screen(const Screen& screen);
    Screen(Screen&& screen);

    const std::string& name() const;

    virtual void draw();
private:
    std::string m_name;
};

#endif // SCREEN_H

screen.cpp

#include "screen.h"

Screen::Screen(const std::string& name)
    : m_name{name}
{
    m_name = name;
}

Screen::Screen(const Screen& screen)
    : m_name{screen.m_name}
{

}

Screen::Screen(Screen&& screen)
    : m_name{std::move(screen.m_name)}
{

}

const std::string& Screen::name() const
{
    return this->m_name;
}

しかし、コンパイル時に問題が発生します。

screen.cpp:4: error: undefined reference to `vtable for Screen'.

そして、すべてのコンストラクタについてです。
それが私の間違いだということがわからないのです...。どなたか教えてください。

どのように解決するのですか?

ascheplerさんのおっしゃることは全くその通りです。冒頭の件ですが、仮想関数はどのような場合に使用するのか、いくつかアドバイスが欲しいところです。仮想関数は、cppのポリモーフィズムをサポートするためのメソッドとして使用され、シナリオを使用して2つに分割することができます。

  1. インターフェース/抽象クラス

    このシナリオでは、仮想関数が pure virtual として宣言され、そのクラスが abstract class と呼ばれるようになります。 非インスタンス . こうすることで、最近のプログラミングでサポートされているような「インターフェイス」を実装することができるのです。

    class Interface {
        //....
        virtual void f() = 0;
    };
    class Concrete {
        // override this f()
        void f() override {}
    };
    
    
  2. ポリモーフィズム/具象クラス

    このシナリオでは、仮想関数は派生クラスでオーバーライドできることを除いて、通常の関数として宣言されています。 そして、あなたはそれを実装する必要があります .

    class Parent {
        //...
        virtual void g();
    }
    class Derived {
        //...
        void g() override{}
    }
    
    

    なお、仮想関数として宣言されていないparentと同じ名前の関数を宣言することは可能です。これは、次のように呼ばれます。 隠す これは別の話です。