我尝试学习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'
”
所有施工人员都是如此 我无法解决这个问题......请问,有人可以解释一下吗?
答案 0 :(得分:4)
您还必须实施Screen::draw
。
在典型的实现中,多态类的构造函数设置指向类" vtable"的指针,该指针包含指向类的虚函数的指针。由于缺少第一个(也是唯一的)虚函数,编译器无法生成此vtable,因此所有构造函数都会在链接时抱怨它。
答案 1 :(得分:2)
aschepler所说的是绝对正确的。关注你的开始,你可能需要一些建议,但应该使用虚函数。 Vitual函数用作支持cpp中多态性的方法,可以使用场景分为两种。
接口/抽象类
在这种情况下,虚函数被声明为纯虚拟,其中一个类将被称为抽象类,非可实现。通过这样做,您可以实现' interface'像大多数现代编程支持一样。
class Interface {
//....
virtual void f() = 0;
};
class Concrete {
// override this f()
void f() override {}
};
多态性/具体类
在这种情况下,虚函数被声明为正常函数,但它可以被派生类覆盖。 您必须实施。
class Parent {
//...
virtual void g();
}
class Derived {
//...
void g() override{}
}
请注意,您仍然可以声明具有相同名称parent的函数,该函数未声明为虚函数。这将被称为隐藏,并且是另一个主题。