继承中同名冲突

来自:唐老师的课程整理

继承中:
子类可以定义父类中的同名函数;
子类中的成员将隐藏父类中的同名成员;
父类中的同名成员依然存在于子类中,可用作用域分辨符“::”以访问其父类中的同名成员。

子类对象可以直接赋值给父类的对象;
父类的指针(或引用)可以直接指向(引用)子类的对象;

看一个例子:

#include 
#include 

using namespace std;

class Parent
{
public:
    int mi;

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

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

class Child : public Parent
{
public:
    int mv;

    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;        //rp是c的一个别名
    Parent* pp = &c;

    rp.mi = 100;
    rp.add(5);             // 没有发生同名覆盖?
    rp.add(10, 10);        // 没有发生同名覆盖?

    /* 为什么编译不过? */
    // pp->mv = 1000;
    // pp->add(1, 10, 100);

    return 0;
}

解释:
当父类指针(或引用)指向子类对象时,
子类对象退化为父类对象;
只能访问父类中的成员;
可以直接访问父类中被子类覆盖的同名函数。
本质:此时的引用(或指针)已经退化成父类了。所以不可能访问子类中的成员。
对于p由于定义的即为父类,所以其属性依然是父类,只有父类中的成员。

#include 
#include 

using namespace std;

class Parent
{
public:
    int mi;

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

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

    void print()
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    int mv;

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

    void print()
    {
        cout << "I'm Child." << endl;
    }
};

void how_to_print(Parent* p)
{
    p->print();
}

int main()
{
    Parent p;
    Child c;

    how_to_print(&p);    // I'm Parent.
    how_to_print(&c);    // I'm Parent.

    return 0;
}

程序调用的都是父类的成员函数print();
想要how_to_print(&c); 调用子类中的成员函数print();则需要在父类的print()函数前加入virtual;实现多态性

你可能感兴趣的:(编程语言C/C++)