父子间兼容性

Posted zsy12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了父子间兼容性相关的知识,希望对你有一定的参考价值。

兼容性:

  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. 可以将父类对象指向之类后,将指针当作父类使用。

 

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

 

以上是关于父子间兼容性的主要内容,如果未能解决你的问题,请参考以下文章

父子间的冲突

C++--同名覆盖多态

父子组件间的传值

jquery

父子间的冲突(四十)

7.QT-Qt对象间的父子关系