父子间兼容性
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. 可以将父类对象指向之类后,将指针当作父类使用。
问题: 子类可以重写父类的成员,但是使用父类指针后又无法访问重写的函数。
以上是关于父子间兼容性的主要内容,如果未能解决你的问题,请参考以下文章