码迷,mamicode.com
首页 > 其他好文 > 详细

父子间兼容性

时间:2019-05-11 12:12:57      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:ace   现在   stream   引用   UNC   print   编译器   对象引用   str   

兼容性:

  1. 子类对象可以直接赋值和初始化父类对象。

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

  3. 父类对象引用可以直接引用子类对象。

 

当使用父类指针或引用指向子类对象时:  

  1. 子类对象退化为父类对象

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

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

 

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    void func(int x)
    {}
    void func(int x, int y)
    {}
};

class Child : public Parent
{
public:
    void func(int x, int y, int z)
    {}
};

int main()
{
    Parent p;
    Child c;
    
    p = c;                    // 用子类赋值给父类  
    Parent p1(c);             // 用子类初始化父类
      
    Parent& cite_p = c;       // 父类引用子类    编译器只能根据指针所指向的类型来判断所指向的对象的类型-->也就是Parent
    Parent* point_p = &c;     // 父类指向子类    指针所指向的类型(parent)来判断所指向的对象的类型(parent)
    
    cite_p.add(1);           // 子类退化为父类
    cite_p.add(1,1);          // 子类退化为父类
    cite_P.add(1,1,1)         // error 子类退化为父类,无法引用子类函数

    point_p.add(1);          // 子类退化为父类
    point_p.add(1,1);        // 子类退化为父类
    point_p.add(1,1,1)       // error 子类退化为父类,无法通过指针访问子类函数  
    return 0;
}

 

函数重写:

  1. 子类中重定义了与父类完全相同的函数。

  2. 重定义发生在继承中时就叫重写。

  3. 函数重写只是一种图书的同名覆盖(函数名和参数完全相同的覆盖)。

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    void print()
    {
        cout << "I‘m Parent." << endl;
    }
};

class Child : public Parent
{
public:
    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.  函数重写却没有用,原因是指针所指向的类型(parent)来判断所指向的对象的类型(parent)
    
    return 0;
}

 

由于编译器对指针的处理方式,所以当对重写后的函数进行指针访问时会出错。

 

子类对象可以当作父类对象使用表现在:

  1. 子类对象给父类赋值和初始化

  2. 可以用父类对象来给子类对象起别名,将引用当作父类使用。

  3. 可以将父类对象指向之类后,将指针当作父类使用。

 

问题: 子类可以重写父类的成员,但是使用父类指针后又无法访问重写的函数。

 

父子间兼容性

标签:ace   现在   stream   引用   UNC   print   编译器   对象引用   str   

原文地址:https://www.cnblogs.com/zsy12138/p/10848218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!