bosthhe1 / cpushpush

0 stars 0 forks source link

继承的细节处理 #22

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

继承的成员要想要初始化只能在初始化列表中完成,不然会报错(需要注意的是,只要是调用了其他的类的成员,想要初始化都必须使用初始化列表) 默认构造函数:父类成员调用父类成员的默认构造函数,子类成员内置类型不做处理,自定义类型会去调用他的默认构造函数 拷贝构造:父类成员调用父类成员的拷贝构造(发生切片),子类成员不写默认按照字节拷贝 赋值:父类成员赋值,需要指定类域调用父类的赋值函数(这里构成隐藏和发生切片),子类成员赋值会按照子类成员规则赋值 析构函数(特例):析构函数子类末尾会自动调用父类的析构函数,不需要自己显示调用,如果显示调用会引发父类析构两次,造成内存泄露的问题,以至于为什么析构函数不用自己写,是因为析构函数底层会替换成一个另外一个名字,所以析构函数如果再多态的情况下,是需要完成虚函数重写的 image

bosthhe1 commented 1 year ago

在父类和子类中,如果存在函数名相同(注意只需要函数名相同就可以了,其他条件不需要)就构成隐藏,父类调用函数可以直接调用,子类如果需要调用函数只能调用自己的函数,如果想调用父类的函数,需要指定作用域

namespace hxh
{
    struct A
    {
        void fun()
        {
            cout << "A::fun()" << endl;
        }
    };
    class B : public A
    {
    public:
        void fun()
        {
            cout << "B::fun()" << endl;
        }
    };
}
int main()
{
    hxh::B b;
    b.fun();//调用自己的fun()函数
    b.A::fun();//指定作用域,调用A的fun()函数
    return 0;
}

image 为什么只需要函数名相同就构成隐藏,大概我想是因为在实例化调用的时候,是直接调用的函数名,比如我们看上面的b调用fun()。