_declspec(novtable)
はどんな状況の下でアクセス違反ですか?例えば_declspec(novtable)が安全でないのはいつですか?
、このコードがない:
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;
}
また、このコードはしません。
class __declspec(novtable) Base
{
public:
virtual ~Base() { };
};
int main(int argc, char* argv[])
{
Base a;
}
しかし、このコードは以下となります。
int main(int argc, char* argv[])
{
Base* a = new Base();
delete a; // access violation
}
なぜコードはありません最初の2つの例では、デストラクタに投げない?
実装されている仮想メンバーはすべて安全ではありません。クラスの代わりに '__interface'を使ってコンパイラにこれを強制することができます。 –
@Hans Passant - ファンシー!私はそれについて知らなかった! – PaulH