C++基础11---类的继承

1. 继承时的调用顺序

当创建子类对象时,先调用父类的构造函数,再调用子类的构造函数。

#include <iostream>
using namespace std;

class Animal
{
public:
    Animal()
    {
        cout << "调用Animal()构造函数" << endl;
    }
};

class Dog: public Animal
{
public:
    Dog()
    {
        cout << "调用Dog()构造函数" << endl;
    }
};

int main()
{
    Dog wangcai;  //"调用Animal()构造函数", 调用Dog()构造函数
}

2. 访问权限与继承权限

访问权限和继承权限共有三种,从权限角度来看,public > protected > private, 访问权限和继承权限不同时,子类的访问权限取决于两者间较低的那个。
在这里插入图片描述

3. 函数遮蔽

1). 若子类中的成员函数与父类中的成员函数相同,此时子类对象.函数名,调用的是子类的成员函数,父类成员函数被遮蔽。

#include <iostream>
using namespace std;

class Animal
{
public:
    void func1()
    {
        cout << "调用Animal::func1()" << endl;
    }
};

class Dog: public Animal
{
public:
    void func1()
    {
        cout << "调用Dog::func1()" << endl;
    }
};

int main()
{
    Dog wangcai;
    wangcai.func1(); //子类的成员函数与父类的成员函数重名,此时调用的是子类的成员函数
}

2).可以在子类成员函数中利用父类::函数名来强制调用父类的同名成员函数。

#include <iostream>
using namespace std;

class Animal
{
public:
    void func1()
    {
        cout << "调用Animal::func1()" << endl;
    }
};

class Dog: public Animal
{
public:
    void func1()
    {
        cout << "调用Dog::func1()" << endl; //调用Dog::func1()
        Animal::func1(); //调用Animal::func1()
    }
};

int main()
{
    Dog wangcai;
    wangcai.func1(); 
}

3).通过using关键字让父类同名函数在子类中可见

#include <iostream>
using namespace std;

class Animal
{
public:
    void func1()
    {
        cout << "调用Animal::func1()" << endl;
    }
    void func1(int)
    {
        cout << "调用Animal::func1(int)" << endl;
    }
};

class Dog: public Animal
{
public:
    void func1()
    {
        cout << "调用Dog::func1()" << endl; //调用Dog::func1()
    }

public:
    using Animal::func1; //将父类的同名函数暴露出来,子类可见
};

int main()
{
    Dog wangcai;
    wangcai.func1(12); //调用Animal::func1(int),子类中没有void func1(int),此时调用父类中的void func1(int)
    wangcai.func1(); //调用Dog::func1(),子类中有void func1(),仍会遮蔽父类中相同的函数,此时调用子类中的void func1(int)
}

说明:
(1) using Animal::func1这种方式只能指定函数名,不能指定参数个数,参数类型,即父类中的所有同名函数都会被暴露,都在子类中可见。
(2)若子类中的函数与父类中函数完全相同(未发生重载),此时,子类对象.函数名,调用的仍是子类的成员函数,父类成员函数被遮蔽。
(3)using的引入主要是为了实现在子类对象中调用父类成员函数的重载版本。

#include <iostream>
using namespace std;

class Animal
{
public:
    void func1()
    {
        cout << "调用Animal::func1()" << endl;
    }
    void func1(int)
    {
        cout << "调用Animal::func1(int)" << endl;
    }
    void func1(int, int)
    {
        cout << "调用Animal::func1(int, int)" << endl;
    }
};

class Dog: public Animal
{
public:
    void func1()
    {
        cout << "调用Dog::func1()" << endl; //调用Dog::func1()
    }

public:
    using Animal::func1; //将父类的同名函数func1(),void func1(int), void func1(int,int)全部暴露出来,子类可见
};

int main()
{
    Dog wangcai;
    wangcai.func1(); //调用Dog::func1(),子类中有void func1(),仍会遮蔽父类中相同的函数,此时调用子类中的void func1(int)
    wangcai.func1(12); //调用Animal::func1(int),子类中没有void func1(int),此时调用父类中的void func1(int)
    wangcai.func1(12, 12);//调用Animal::func1(int, int), 子类中没有void func1(int, int),此时调用父类中的void func1(int,int)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值