Aracılığıyla paylaş


Uyarı C26436

Sanal işlev içeren 'symbol' türü genel sanal veya korumalı sanal olmayan yıkıcıya (c.35) ihtiyaç duyar

C++ Temel Yönergeleri: C.35: Temel sınıf yıkıcısı genel ve sanal ya da korumalı ve sanal olmayan olmalıdır

Bir sınıf bir sanal işlev tanımlarsa, türetilmiş sınıfların kaynak yönetimi ve yok etme mantığı dahil olmak üzere davranışını değiştirebileceği anlamına gelen çok biçimli hale gelir. İstemci kodu, temel sınıflara yönelik işaretçiler aracılığıyla çok biçimli türleri çağırabileceğinden, istemcinin hangi davranışın uygun olduğunu aşağı noktaya yayın olmadan açıkça seçebileceği bir yol yoktur. Kaynakların tutarlı bir şekilde yönetildiğinden ve yok etme işleminin gerçek türün kurallarına göre gerçekleştiğinden emin olmak için bir genel sanal yıkıcı tanımlamanız gerekir. Tür hiyerarşisi, istemci kodunun nesneleri doğrudan yok etmesine izin vermek üzere tasarlanmışsa, yıkıcılar sanal olmayan korumalı olarak tanımlanmalıdır.

Açıklamalar

  • Uyarı, türün ilk sanal işlev tanımında (genel değilse bir sanal yıkıcı olabilir) tür başına bir kez gösterilir.

  • Bir tanım bir bildirimden ayrı olarak yerleştirilebildiği için, her zaman sanal tanımlayıcılardan herhangi birine sahip olmayabilir. Ancak uyarı hala geçerli: bir işlevin gerçek 'sanallığını' denetler.

Kod analizi adı: NEED_VIRTUAL_DTOR

Örnek

namespace no_destructor
{
    struct base {
        virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
    };
}

Temel sınıf sanal bir genel yıkıcıya veya korumalı sanal olmayan bir yıkıcıya sahip olduğunda uyarı görünmez.

namespace virtual_destructor
{
    struct base {
        virtual ~base();
        virtual void foo() {}
    };
}
namespace protected_destructor
{
    struct base {
        virtual void foo() {}
    protected:
        ~base() {}
    };
}