用c ++调用的构造函数(继承类)

时间:2018-03-23 09:06:07

标签: c++ constructor

 export default {

        computed: {                
            ...mapGetters('global', ['isUserSignedIn']),              

        },
       watch: {          
        isUserSignedIn: function (newVal, oldVal) {
            if (newVal !== undefined) {
                 console.log('ok, correct result') 
            }
        }
    },
        updated() {
            this.$nextTick(function () {
                // Code that will run only after the
                // entire view has been re-rendered
                console.log('updated: ' + this.isUserSignedIn)
            })

        },
        created() {
            console.log('created :' this.isUserSignedIn)

            }
        }

    }

为什么在创建#include <iostream> class A { public: A() { std::cout << "A's constructor called\n"; } }; class B { public: B() { std::cout << "B's constructor called\n"; } }; class C: public B, public A // Note the order { public: C() { std::cout << "C's constructor called\n"; } }; int main() { C c; return 0; } 的新实例时调用了类AB的构造函数?

输出

B's constructor called
A's constructor called
C's constructor called

3 个答案:

答案 0 :(得分:2)

C是从A和B派生的 - 所以在可以执行C的构造函数之前,必须完成A和B的构造函数。如果情况并非如此,则C构造函数不能依赖其基类提供的任何内容。

例如,假设A包含从其构造函数中的数据库创建和归档的项列表。 A的所有实例都可以依赖列表完成,因为构造函数必须在实例可用于其余代码之前完成。但是C也是A - 它的衍生方式与“福特”也是“汽车”的方式相同 - 所以它可能想要访问该列表。构造实例时,会在派生类之前自动调用基类构造函数,以确保在派生构造函数启动时所有内容都已准备就绪。

例如,稍微更改您的代码:

class A
{
public:
A() { cout << "A's constructor called" << endl; }
};

class B: public A
{
public:
B() { cout << "B's constructor called" << endl; }
};

class C: public B
{
public:
C() { cout << "C's constructor called" << endl; }
};

int main()
{
C c;
return 0;
}

你会得到:

A's constructor called
B's constructor called
C's constructor called  

因为基类构造函数在执行派生之前都已完成。

答案 1 :(得分:1)

为什么不呢? C包含分别为BA的部分,这些部分也需要构建。构造函数是执行此角色的功能。

答案 2 :(得分:0)

kanishk tanwar的回答有更详细的说明,但无论如何我都在写这篇文章,所以这里有一个非常好的停止游览,为什么它会回答你的问题:

为了确保正确初始化类的实例,始终调用基类型的构造函数。如果您没有指定要调用的构造函数(语法:C() : B(), A()的{​​{1}}构造函数),则使用默认构造函数。当派生类构建在基类之上时,必须首先构造基类。

在您的情况下,您已为默认构造函数指定了内容,因此这是您实例化C时运行的代码。