簡體   English   中英

繼承類的構造函數沒有運行

[英]Inherited class's constructor is not running

我有 3 個班級,A、B 和 C。

編輯的代碼。

#include <iostream>

class A {
    public:
        virtual void print() {
            std::cout << "A" << std::endl;
        }

        A() : x(0) {} // constructor

        void SetX (int tmp){
            x = tmp;
        }
        
        void printX() {
            std::cout << "x = " << x << std::endl;
        }

    private:
        int x;
};


class B : public A {
    public:
        virtual void print(){
            std::cout << "B" << std::endl;
        }
    
        B(int tmp) : A() {
            SetX(tmp);
        }

};

class C : public B {
    public:
        virtual void print(){
            std::cout << "C" << std::endl;
        }
    
        C(int tmp) : B(tmp) {
            std::cout << "Debug print" << std::endl;
        }
};

int main() {
    B* b = new B(1);
    C* c = new C(2);
    
    b->print();
    b->printX();
    c->print();
    c->printX();
    
    return 0;   
}

打印 b->printX = 1 和 c->printX = 0

創建 object B 時,一切正常。

但是在創建 object C 時,class A (var x) 的默認值仍然是 0(默認值)。

我在 class C 的構造函數中添加了調試行,但我沒有在日志中看到它,看起來構造函數沒有運行。 當只創建 object C 時,我在 class B 的構造函數中做了同樣的事情,我也沒有看到任何調試打印。

此代碼沒有任何編譯錯誤。 構建成功完成。

以下是合法且有效的 C++。 您的代碼不合法 C++。

我在 class A 中添加了一個void printX()方法來說明示例。

#include <iostream>

class A {
    public:
        virtual void print() {
            std::cout << "A" << std::endl;
        }

        A() : x(0) {} // constructor

        void SetX (int tmp){
            x = tmp;
        }
        
        void printX() {
            std::cout << "x = " << x << std::endl;
        }

    private:
        int x;
};


class B : public A {
    public:
        virtual void print(){
            std::cout << "B" << std::endl;
        }
    
        B(int tmp) : A() {
            SetX(tmp);
        }

};

class C : public B {
    public:
        virtual void print(){
            std::cout << "C" << std::endl;
        }
    
        C(int tmp) : B(tmp) {
            std::cout << "Debug print" << std::endl;
        }
};

int main() {
    B* b = new B(1);
    C* c = new C(2);
    
    b->print();
    b->printX();
    c->print();
    c->printX();
    
    return 0;   
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM