C++ abstrakte Klasse - seltsame Compiler warnings

Kamikaze

Warrior of Sunlight
Teammitglied
Die Klasse ist das was man unter Java als Interface bezeichnen würde:
Code:
class Node;
class NodeVisitor {
    public:
    virtual void visit(uint8_t const scale, Node const &node) = 0;
};

Dazu gibt es von clang++ ein Warning:
/NodeVisitor.hpp:15:8: warning: 'NodeVisitor' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]

Für mich stellt sich hier die Frage, wozu braucht man eine vtable für eine Klasse die nicht Instantiiert werden kann? Ist das Warning einfach nicht ausgereift?

Weiter geht es:
Code:
class Serialise : public NodeVisitor {
    private:
    […]
    public:
    Serialise(std::ostream &os);
    virtual void visit(uint8_t const scale, Node const &node);
};
Dazu gibt es folgendes Warning:
Serialise.hpp:17:8: warning: 'octree::Serialise' has virtual functions but non-virtual destructor [-Wnon-virtual-dtor]

Weder NodeVisitor noch Serialise habein überhaupt einen Destruktor. Ist der implizit oder ist das Warning kaputt?
 
Die Klasse ist das was man unter Java als Interface bezeichnen würde:
Code:
class Node;
class NodeVisitor {
    public:
    virtual void visit(uint8_t const scale, Node const &node) = 0;
};

Dazu gibt es von clang++ ein Warning:
/NodeVisitor.hpp:15:8: warning: 'NodeVisitor' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]

Für mich stellt sich hier die Frage, wozu braucht man eine vtable für eine Klasse die nicht Instantiiert werden kann? Ist das Warning einfach nicht ausgereift?
Du kannst Pointer auf NodeVisitor anlegen und die dereferenzieren, ihre Member aufrufen, insofern brauchst du die vtable. Sogar genau dafür brauchst du sie. Sonst könntest du Funktionsdeklaration ja auch gleich weglassen oder nicht-virtuell machen (wenn es nicht um ein "Interface" ginge).
Sieh zB http://www.studytonight.com/cpp/abstract-class-and-pure-virtual.php

Weiter geht es:
Code:
class Serialise : public NodeVisitor {
    private:
    […]
    public:
    Serialise(std::ostream &os);
    virtual void visit(uint8_t const scale, Node const &node);
};
Dazu gibt es folgendes Warning:
Serialise.hpp:17:8: warning: 'octree::Serialise' has virtual functions but non-virtual destructor [-Wnon-virtual-dtor]

Weder NodeVisitor noch Serialise habein überhaupt einen Destruktor. Ist der implizit oder ist das Warning kaputt?

Außer du definiert = delete gibt es immer einen impliziten Desktruktor und der ist nicht-virtuell, außer der der Base-Class ist virtuell, dann ist auch der implizite der erbenden Klasse virtuell.

Siehe dazu auch:
http://en.cppreference.com/w/cpp/language/destructor
 
Zurück
Oben