Under what circumstances will _declspec( novtable )
cause an access violation?
For example, this code doesn't:
class __declspec(novtable) Base
{
public:
virtual ~Base() { };
virtual int Foo() const = 0;
virtual int Bar() const { return 2; };
};
class A : public Base
{
public:
int Foo() const { return 1; };
};
int main(int argc, char* argv[])
{
A a;
volatile int a1 = a.Foo();
volatile int a2 = a.Bar();
Base* c = new A();
volatile int c1 = c->Foo();
volatile int c2 = c->Bar();
delete c;
return 0;
}
This code also does not:
class __declspec(novtable) Base
{
public:
virtual ~Base() { };
};
int main(int argc, char* argv[])
{
Base a;
}
But, this code will:
int main(int argc, char* argv[])
{
Base* a = new Base();
delete a; // access violation
}
Why does the code in the first two example not throw on the destructors?
http://msdn.microsoft.com/en-us/library/k13k85ky%28v=vs.71%29.aspx
If you attempt to instantiate a class marked with novtable and then access a class member, you will receive an access violation (AV).
The code where you get an access violation is the code where you're explicitly calling "delete" on the novtable class.