2017-04-26 1 views
5

Ich habe versucht, eine reine virtuelle Funktion in Base-Klasse zu schreiben, und ich gebe es einen Körper in der Nähe der Definition, wie es im Code unten gezeigt, wie ich weiß, ich sollte einen Kompilierfehler erhalten, aber alles hat gut funktioniert. Ist es etwas Neues, das mit C++ 17 kommt? (I verwendet Visual Studio 2017)Körper für reine virtuelle Funktion in C++ 17?

class Base { 
public: 
virtual void virtual_func() { std::cout << "This a virtual function from BASE" << std::endl; }; 
virtual void pure_func() = 0 { std::cout << "This a PURE virtual function from BASE" << std::endl; }; 
}; 

Dank

+0

„Ich weiß, ich sollte einen Compiler-Fehler erhalten“ - warum? Es ist vollkommen legal, rein virtuelle Funktionen zu implementieren. –

+2

Der Standard erlaubt dies nicht, aber VS (oder genauer gesagt, der Compiler von Microsoft). Um sich anzupassen, müssen Sie die Definition von der Deklaration trennen. –

+0

@Neil Butterworth Ich denke nicht. Es kann nicht in C++ 14 kompiliert werden. http://ideone.com/EISKsp – javaLover

Antwort

4

Das reine virtuelle kann nicht zusammen mit einer Definition verwendet werden. Das gilt in C++ 11 und in C++ 14:

10,4/2: ...
[Hinweis: Eine Funktionsdeklaration sowohl einen reinen-Spezifizierer nicht zur Verfügung stellen kann und eine Definition - Endnote] [Beispiel:

struct C { 
virtual void f() = 0 { }; // ill-formed 
}; 

Die gleiche Aussage (unter Abschnitt 13.4/2 diesmal) ist nach wie vor gilt für C++ 17 (N4659).

Also, wenn Ihr Compiler diesen Code annehmen, ist es sicherlich ein Fehler (gcc 7.1 doesesn't)

+0

yeah, du hast Recht, alte Hand, AFAIR. +1 – snr

+1

FYI, ich habe diesen Fehler an Microsoft gemeldet: https://developercommunity.visualstudio.com/content/problem/187888/msvc-incorrectly-allows-pure-virtual-function-defi.html –

Verwandte Themen