إذا كانت الفئة الأساسية المجردة عبارة عن واجهة، فهل من الضروري استدعاء مُنشئ الفئة الأساسية في مُنشئ الفئة المشتقة؟

StackOverflow https://stackoverflow.com/questions/270592

سؤال

class AbstractQuery {
    virtual bool isCanBeExecuted()=0;
public:
    AbstractQuery() {}
    virtual bool Execute()=0;
};

class DropTableQuery: public AbstractQuery {
    vector< std::pair< string, string> > QueryContent;
    QueryValidate qv;
public:
    explicit DropTableQuery(const string& qr): AbstractQuery(), qv(qr) {}
    bool Execute();
};

هل من الضروري استدعاء المنشئ الأساسي في مُنشئ الفئة المشتقة؟

هل كانت مفيدة؟

المحلول

لا، في الواقع لأنها غير ضرورية للفئة الأساسية أن يكون لها منشئ محددة بشكل واضح (جعل على الرغم من أن لديك المدمر الظاهري).

وهكذا على واجهة نموذجية هل يمكن أن يكون شيء من هذا القبيل:

class MyInterface {
public:
    virtual ~MyInterface() {}
    virtual void execute() = 0;
};

وتحرير: وإليك السبب يجب أن يكون المدمر الظاهري:

MyInterface* iface = GetMeSomeThingThatSupportsInterface();
delete iface; // this is undefined behaviour if MyInterface doesn't have a virtual destructor

نصائح أخرى

إنها أبداً يجب استدعاء مُنشئ الفئة الأساسية بشكل صريح، ما لم يكن لديه معلمات.سيقوم المترجم باستدعاء المُنشئ تلقائيًا.من الناحية النظرية، لا تزال الفئة الأساسية تحتوي على مُنشئ، ولكن قد يقوم المترجم بتحسينه وإزالته إذا لم يفعل أي شيء.

لا، ليس في المثال الذي قدمته. وسوف يطلق المنشئات الافتراضي الفئة الأساسية "تلقائيا في نفس الترتيب الذي يتم الإعلان عن فئات أساسية، قبل أن يتم تهيئة أي عضو من فئة مشتقة.

إذا لم منشئ الفئة الأساسية ل يحتاج إلى أي المعلمات، لا تحتاج أن نسميها في فئة مشتقة منذ يطلق عليه باعتباره المنشئ الافتراضي. ومع ذلك تحتاج إلى توفير المدمر الظاهري لفئة الأساسي الخاص بك حتى لو كان فارغا. إلا المترجم سوف تولد المدمر الافتراضي وهو غير الظاهري افتراضيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top