Or, are there any other known negative affects of employing __declspec(novtable)? I can't seem to find references to any issues.
Does using __declspec(novtable) on abstract base classes affect RTTI in any way?
8.3k Views Asked by oz10 At
2
There are 2 best solutions below
0
gangs
On
if I understand it correctly: Any virtual fn call inside a ctor or a dtor is converted to a compile time linking. We cannot make virtual fn calls from the (c/d)tors. The reason is that at the time the object of the base class is getting created it has no knowledge of the derived class and hence cannot make the call to derived class and w.r.t the dtors the same logic applies.
Related Questions in C++
- C++ using std::vector across boundaries
- Linked list without struct
- Connecting Signal QML to C++ (Qt5)
- how to get the reference of struct soap inherited in C++ Proxy/Service class
- Why we can't assign value to pointer
- Conversion of objects in c++
- shared_ptr: "is not a type" error
- C++ template using pointer and non pointer arguments in a QVector
- C++ SFML 2.2 vectors
- Lifetime of temporary objects
- I want to be able to use 4 different variables in a select statement in c ++
- segmentation fault: 11, extracting data in vector
- How to catch delay-import dll errors (missing dll or symbol) in MinGW(-w64)?
- How can I print all the values in this linked list inside a hash table?
- Configured TTL for A record(s) backing CNAME records
Related Questions in VISUAL-STUDIO
- NuGet - Given a type name or a DLL, how can I find the NuGet package?
- Exception thrown at 0x0131EB06 Visual Studio
- Visual Studio 2015 Cordova Plugin Add Fail
- Cannot find InvalidCastException in C# Application
- generating C# code file during Visual Studio build
- Can I deploy multiple instances of my application on the same windows phone?
- Close the Solution Explorer window
- How to generate entity framework code-first migrations without using the package manager console?
- Implementing callback function for dialog-based application
- VB.net: How to make original variable value fulfill 2 statements?
- DLL being marked as DELETEPENDING
- String tokenizing in Visual Studio C++
- How to use "Multicharts Studies" in Visual Studio 2013?
- Programs Will Not Run In Visual Studio
- VB.Net: Display total when check boxes are checked
Related Questions in VISUAL-C++
- I want to be able to use 4 different variables in a select statement in c ++
- llvm headers do not compile under msvc 2013
- VC++ .net: Functionality from managed DLL is not exported
- Add a picture to Picture Control in a dialog box (error RC2108: expected numerical dialog constant)
- Within a .vcxproj file what are the possible values for the <ConfigurationType> and what do those values mean?
- converting string to a double in visual c++ by parsing
- How to integrate opencv C++ codings with windows application?
- Create string with ESC characters
- What does the thing between "class" and the class name in VC++ mean?
- How to assign (Root)Folder ID in C++? Wherein, those files and folder under it would have the same ID as the RootFolder
- How to convert CString to long? VC++
- How to initialize a String^ *
- How to correctly implement methods of a class returning "this" in Managed C++?
- Non-managed referenced code strangely, "magically" changes its state for no reason when wrapped in managed
- Windows application using libusb: runtime error due to mutex lock
Related Questions in RTTI
- Simplest way to know a class's type
- What problems lead Stroustrup to say C++ exceptions are "badly implemented in a lot of places"?
- Why is dynamic type not known until runtime in C++?
- RTTI support for C++11 ( _CPPRTTI and __GNUG__ )
- Does it make sense to use std::forward with the typeid operator?
- Store arbitrary data into object instance
- Use RTTIField.SetValue to set a Pointer to a Field
- What is wrong with this?
- Getting type_info from variadic template breaks the compiler... why?
- Iterate read-only properties in Delphi
- Change component properties using SetPropValue() and RTTI with Delphi Tokyo
- Can I disable RTTI selectively in my code base to reduce the binary size?
- Use std::type_index as value in a map
- Where is the RTTI metadata stored in the executable file?
- How do I typecast with type_info?
Related Questions in COMPILER-SPECIFIC
- What features does threadsanitizer lack that are supported by helgrind, and vice-versa?
- g++ generating the "complete object allocating constructor"
- Libc name and compilers
- Why is .data and .bss section copied to SRAM from the flash memory in the start up file?
- C# does the compiler leave re-references in the final binary?
- How many object files can I pass to a linking task?
- Calling methods of temporary objects created using class template argument deduction
- How to manage duplicate assembly references C# Unity / How to compile C# project with flags
- Does using __declspec(novtable) on abstract base classes affect RTTI in any way?
- On which compilers or with which compiler flags, pointer arithmetic rule violation may cause troubles?
- How does GCC optimize this `switch`
- Size of implementation specific std::mbstate_t
- Intel Compiler - error: identifier "alignof" is undefined
- Can an inline variable be changed after initialization in C++17?
- Why are GHC tuples limited to size 62?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
MSCV uses
one vptr per object and one vtbl per classto implement OO mechanism such as RTTI and virtual functions.So RTTI and virtual functions will work fine if and only if the vptr has been set correctly.
B should be an abstract class when use
__declspec(novtable).There will be no instance of B except in the constructor of D1.
And __declspec(novtable) has no negative affects in most case.
But during the construction of derived class
__declspec(novtable)will make it different from ISO C++ semantic.Note: virtual f()
= 0; makes f to be apure virtual functionand B to be an abstract class.The
definitionof a pure virtual functioncould(notmust) be missing.C++ allows virtual function call in constructor which we don't recommend.
Update: A mistake in D2 : the vptr in derived constructor.
But vptr is indeterminate during the construction.It's one of the reason that virtual function call in constructor aren't recommend .
If vptr in D2::D2() was B and definition of B::f() was missing,
this->f();will crash when dereference pointer-to-function in the vtbl.If vptr in D2::D2() was B and B use novtable,
this->f();will crash when dereference an uninitialized vptr.In fact , vptr in D2::D2() is D2 in MSVC(msvc8).The compiler set vptr to D2 before execute other code in D2::D2().
So
this->f();calls D2::f() and the three assertions will be violated.