未明确引用`vtable'在构造函数

时间:2017-04-14 01:38:04

标签: c++ c++11

我尝试学习C ++构造函数,Imma noobie。我写了下一堂课:
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:错误:未定义引用“vtable for Screen'

所有施工人员都是如此 我无法解决这个问题......请问,有人可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

您还必须实施Screen::draw

在典型的实现中,多态类的构造函数设置指向类" vtable"的指针,该指针包含指向类的虚函数的指针。由于缺少第一个(也是唯一的)虚函数,编译器无法生成此vtable,因此所有构造函数都会在链接时抱怨它。

答案 1 :(得分:2)

aschepler所说的是绝对正确的。关注你的开始,你可能需要一些建议,但应该使用虚函数。 Vitual函数用作支持cpp中多态性的方法,可以使用场景分为两种。

  1. 接口/抽象类

    在这种情况下,虚函数被声明为纯虚拟,其中一个类将被称为抽象类,非可实现。通过这样做,您可以实现' interface'像大多数现代编程支持一样。

    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的函数,该函数未声明为虚函数。这将被称为隐藏,并且是另一个主题。

相关问题