【C++】48 同名覆盖引发的问题

抽象苔藓
• 阅读 100

父子间的赋值兼容

子类对象可以当做父类对象使用(兼容性)

子类对象可以直接赋值给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接引用子类对象

48-1.cpp

#include <iostream>

#include <string>



using namespace std;



class Parent

{

 public:
 int mi;
    int add(int i)
    {
        mi += i;
    }
    int add (int a,int b)
    {
        mi +=(a + b);
    }

};

class Child : public Parent

{

 public:

    int mv;
    int 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);
    
    pp->mv = 1000;
    pp -> add(1,10,100);

    return 0;

}

输出:
error

父子间的赋值兼容

当使用父类指针(引用)指向子类对象时

子类对象退化为父类对象

只能访问父类中定义的成员

可以直接访问被子类覆盖的同名成员

特殊的同名函数

子类中可以重定义父类中已经存在的成员函数

这种重定义发生在继承中,叫做函数重写

函数重写是同名覆盖的一种特殊情况

#include <iostream>

#include <string>



using namespace std;



class Parent

{

 public:
 int mi;
    int add(int i)
    {
        mi += i;
    }
    int add (int a,int b)
    {
        mi +=(a + b);
    }
    void print()
    {
        cout<< "I'm Parent."<<endl;
    }

};

class Child : public Parent

{

 public:

    int mv;
    int 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;
    p.print();
    c.print();
    how_to_print(&p);
    how_to_print(&c);
    

    return 0;

}

输出:

I'm Parent.
I'm child.
I'm Parent.
I'm Parent.

问题分析:

编译期间,编译器只能根据指针的类型判断所指向的对象

根据赋值兼容,编译器认为父类指针指向的是父类对象

因此,编译结果只可能是调用父类中定义的同名函数

【C++】48 同名覆盖引发的问题

小结:

子类对象可以当做父类对象使用

父类指针可以正确的指向子类对象

父类引用可以正确的代表子类对象

子类中可以重写父类中的成员函数

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java中多态的实现机制
多态的概念:  简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象。程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法。多态存在的前提:1、存在继承关系,子类继承父类;2、子类重写父类的方法;3、父类引用指向子类对象。具体实例:1、定义一个父类:Animal
Wesley13 Wesley13
3年前
java向上转型和向下转型1
  在java继承体系中,认为父类(超类)在上层,子类在下层(派生类),向上转型就是把子类对象转成父类对象。1publicclassFather{2publicvoideat(){3System.out.println("我是父类的方法吃。。。。。");4}
Wesley13 Wesley13
3年前
Java 多态
类型的检测——向上转型向下转型向上转型:父类对象的引用指向子类对象,向下转型:向上转型的基础上再次指向子类的对象1.向上转型!(https://oscimg.oschina.net/oscnet/dd0d05d39a724e781b799ff5e35b921775d.jpg)!(https://oscimg.oschina.net/o
Wesley13 Wesley13
3年前
Java的类继承
知识点1、继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足isa的逻辑关系,才能使用继承。如:苹果isa水果语法:使用extends连接子类和父类。子类extends父类Java是单继承,一个类只能继承一个父类。子类不能继承父类私有的属性,但是可以
Wesley13 Wesley13
3年前
Java多线程进阶干货(2)
问题1:子类可以调用父类的同步方法吗?/    一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,  再次申请时,仍然会得到该对象的锁,也就是说synchronized获得的锁是可重入的   这里是继承中有可能发生的情形,子类调用父类的同步方法 /public class Test09 {    sy
Wesley13 Wesley13
3年前
Java基础学习总结(8)——super关键字
一、super关键字  在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
Wesley13 Wesley13
3年前
C++多态学习之向下强制类型转换
向下强制类型转换在C中,基类(父类)指针可以指向派生类(子类)对象,因为派生类对象也是一个基类对象(但反过来不一样,基类对象不是一个派生类对象)。然而基类指针只能调用基类的成员函数,如果试图使用该指针调用仅在派生类中含有的成员函数(子类特有的,不是继承和重写父类的函数),将会产生编译错误。为了避免这一错误,就必须将基类指针转换成为派
Wesley13 Wesley13
3年前
Java基础学习总结(4)——对象转型
一、对象转型介绍!(http://static.oschina.net/uploads/img/201512/31130644_mPJ1.jpg)  对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型。转型的意思是:如把float类型转成int类型,把do
可莉 可莉
3年前
20175317 《Java程序设计》第四周学习总结
20175317《Java程序设计》第四周学习总结教材学习内容总结第四周我学习了教材第五章的内容,了解了子类与继承的知识,学到了以下内容:明白了什么是子类与父类、类的树形结构。子类和父类在同一包中、不在同一包中时的继承性。子类与对象,子类对象的特点。成员变量的隐藏与方
Stella981 Stella981
3年前
20175317 《Java程序设计》第四周学习总结
20175317《Java程序设计》第四周学习总结教材学习内容总结第四周我学习了教材第五章的内容,了解了子类与继承的知识,学到了以下内容:明白了什么是子类与父类、类的树形结构。子类和父类在同一包中、不在同一包中时的继承性。子类与对象,子类对象的特点。成员变量的隐藏与方
Wesley13 Wesley13
3年前
09面向对象高级特性二
面向对象高级特性二上转型对象(上溯)如果A类是B类的父类,当我们用子类创建对象,并把这个对象的引用放到父类的对象中时:Aa;BbnewB();     或        AanewB();ab;称父类对象a是子类对象b的上转型对象。上转型对象