设为首页 加入收藏

TOP

继承(二)(一)
2019-09-30 16:41:42 】 浏览:93
Tags:继承

1. 父子间的同名冲突

同名变量冲突

  • 子类可以定义父类中的同名成员变量
  • 父类中的同名成员变量被隐藏,但仍然存在于子类中
  • 父类中的同名成员变量需要通过作用域分辨符(::)访问
Child c;
c.mi = 100;           //访问子类中的mi
c.Parent::mi = 1000;  //访问父类中的mi
#include <iostream>
#include <string>

using namespace std;

namespace A
{
int g_i = 0;
}

namespace B
{
int g_i = 1;
}

class Parent
{
public:
    int mi;

    Parent()
    {
        cout << "Parent() : " << "&mi = " << &mi << endl;
    }
};

class Child : public Parent
{
public:
    int mi;

    Child()
    {
        cout << "Child() : " << "&mi = " << &mi << endl;
    }
};

int main()
{
    Child c;

    c.mi = 100;
    c.Parent::mi = 1000;

    cout << endl;
    cout << "&c.mi = " << &c.mi << endl;
    cout << "c.mi = " << c.mi << endl;
    cout << endl;

    cout << "&c.Parent::mi = " << &c.Parent::mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;

    return 0;
}

同名函数冲突

  • 子类中的成员函数将隐藏父类的同名成员函数(只需要同名即可,对参数列表和返回值类型无要求
  • 使用作用域分辨符访问父类中的同名成员函数
  • 子类可以定义与父类完全相同的成员函数(包括函数名,参数列表、返回值类型)
  • 子类无法重载父类中的成员函数
#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    int mi;

    void add(int v)
    {
        mi += v;
    }

    void add(int a, int b)
    {
        mi += (a + b);
    }
};

class Child : public Parent
{
public:
    int mi;

    void add(int v)
    {
        mi += v;
    }

    void add(int a, int b)
    {
        mi += (a + b);
    }

    void add(int x, int y, int z)
    {
        mi += (x + y + z);
    }
};

int main()
{
    Child c;

    c.mi = 100;
    c.Parent::mi = 1000;

    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;

    c.add(1);
    c.add(2, 3);
    c.add(4, 5, 6);

    c.Parent::add(1);
    c.Parent::add(2, 3);

    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;

    return 0;
}

2. 同名冲突引发的问题

父子间的赋值兼容

父子间的赋值兼容,指的是子类对象可以当作父类对象使用,具体表现在两个方面

  • 子类对象可以直接初始化父类对象,或者给父类对象赋值
  • 父类指针(引用)可以直接指向(引用)子类对象
  • 实际上仅仅指向(引用)了子类对象中的父类部分
  • 通过父类指针(引用),只能访问父类中的成员变量和成员函数
  • 子类对象本身不受影响,依然可以访问自身的成员
#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    int mi;

    Parent(int i = 0)
    {
        mi = i;
    }

    void add(int i)
    {
        mi += i;
    }

    void add(int a, int b)
    {
        mi += (a + b);
    }
};

class Child : public Parent
{
public:
    int mv;

    Child(int v = 0)
    {
        mv = v;
    }

    void add(int x, int y, int z)
    {
        mv += (x + y + z);
    }
};

int main()
{
    Parent p;
    Child c;

    /*子类对象初始化或赋值给父类对象,仅仅用子类对象中的父类部分进行相应操作*/
    p = c;
    Parent p1(c);

    /*父类指针或引用指向子类对象,指向的仅仅是子类中的父类部分*/
    Parent &rp = c;
    Parent *pp = &c;

    rp.mi = 100;
    rp.add(5);
    rp.add(10, 10);

    cout << "p.mi = " << p.mi << endl;
    cout << "c.mv = " << c.mv << endl;
    cout << "rp.mi = " << rp.mi << endl;
    cout << "pp->mi = " << pp->mi << endl;
    cout << endl;

    /*编译不过,只能访问父类中的成员*/
    // pp->mv = 1000;
    // pp->add(1, 10, 100);

    /*父类指针或引用指向子类对象,对子类对象本身没有影响*/
    c.mv = 1000;
    c.add(1, 1, 1);

    cout << "p.mi = " << p.mi << endl;
    cout << "c.mv = " << c.mv << e
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇抽象类和接口 下一篇cf-786B区间图最短路

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目