006 子类父类赋值兼容规则

子类和父类的赋值兼容规则

1.同名隐藏(非常重要)

当子类的成员方法(show)和父类的成员方法(show)的名字相同的时候,父类的所有(show)方法,都不能用子类的对象来调用了,这种现象就是同名隐藏。

#include <iostream>
using namespace std;

class Base{
public:
  Base():d(0){}
  ~Base(){}
  void show(){
    cout << "Base show" << endl;
  }
  void show(int i){
    cout << "Base show(" << i << endl;
  }
private:
  int d;
};

class D : public Base{
public:
  D():x(0){}
  ~D(){}
  void show(){
    cout << "D show" << endl;
  }
private:
  int x;
};
int main(){
  D d;
  d.show();
  //编译不过
  //d.show(20);//因为子类也定义了show方法,所以父类的2个show方法,就都不可以用子类的对象来调用了
  d.Base::show(20);
}

2.子类和父类的对象/指针/引用赋值

可以用子类的对象/地址/引用去赋值给父类,叫对象切片,或者叫向上赋值,但是反过来是不可以的。

赋值后,只能调用父类里的成员方法,不能调用子类里的成员方法。

#include <iostream>
using namespace std;

class Base{
public:
  Base():d(0){}
  ~Base(){}
  void show(){
    cout << "Base show" << endl;
  }
  void show(int i){
    cout << "Base show(" << i << endl;
  }
private:
  int d;
};

class D : public Base{
public:
  D():x(0){}
  ~D(){}
  void show(){
    cout << "D show" << endl;
  }
  void list(){
    cout << "D list" << endl;
  }
private:
  int x;
};

int main(){
  D d;

  Base b;
  b = d;
  b.show();
  //编译不过
  //b.list();//不可以用父类的对象调用子类的方法  

  Base *pb;
  pb = &d;
  pb->show();//调用的是父类的show方法
  //编译不过
  //pb->list();//不可以用父类的指针调用子类的方法                                                                   

  Base &ps = d;
  ps.show();//调用的是父类的show方法
  //编译不过
  //ps.list();//不可以用父类的引用调用子类的方法
}
3. 虚函数

当用子类的对象/指针/引用去赋值给父类时,如果子类和父类都有同名方法show,当调用show的时候,发现调用的是父类的show方法。如果想要达到调用子类的show方法的效果的话,必须用virtual关键字,修饰父类的show方法,而且父类必须是指针或者引用,不可以是对象。

#include <iostream>
using namespace std;

class Base{
public:
  Base():d(0){}
  ~Base(){}
  virtual void show(){//虚函数
    cout << "Base show" << endl;
  }
  void show(int i){
    cout << "Base show(" << i << endl;
  }
private:
  int d;
};

class D : public Base{
public:
  D():x(0){}
  ~D(){}
  void show(){
    cout << "D show" << endl;
  }
  void list(){
    cout << "D list" << endl;
  }
private:
  int x;
};

int main(){
  D d;

  Base b;
  b = d;
  b.show();//调用的是父类的show

  Base *pb;
  pb = &d;
  pb->show();//调用的是子类的show

  Base &ps = d;
  ps.show();//调用的是子类的show
}

原文地址:https://www.cnblogs.com/guojun/p/9723046.html

时间: 2024-11-07 02:26:29

006 子类父类赋值兼容规则的相关文章

【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

实现基类(父类)以及派生类(子类),验证继承与转换--赋值兼容规则: 子类对象可以赋值给父类对象(切割/切片) 父类对象不能赋值给子类对象 父类的指针/引用可以指向子类对象 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成) #include<iostream> using namespace std; class People    //父类或者基类 { public:     void Display()     {         cout << "_na

【总结】C++基类与派生类的赋值兼容规则

在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则: 1.子类对象可以赋值给父类对象(切割/切片) 在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生"is-a"的关系,这种关系会导致子类中有结构的嵌套这父类的信息,.所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功.若为私有继承,则会产生"has-a"的关系,这种关系是从属关系,基类中的数据仅仅是包含在派生类中,若赋值,则不会产生类似于降级的事

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

C++:同名隐藏和赋值兼容规则

一.同名隐藏 同名隐藏,即在C++的继承中,只要子类的函数名和父类的函数名相同,子类中的函数将会隐藏所有父类中和子类的成员函数同名的函数 特别注意: 和函数之间的重载不同,这里只要求函数的名字相同,而对函数的参数列表是否相同不做要求.话句话说父类中和子类的成员函数名相同但参数列表不同的成员函数也会被隐藏 示例: 1 #include<iostream> 2 using namespace std; 3 class Father{ //父类 4 public: 5 Father()=defaul

(继承及其访问限定符)&amp;&amp;(派生类及其默认成员函数)&amp;&amp;(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

赋值兼容规则(C++)

在一定条件下,不同类型的数据之间可以进行类型转换,如可以将整型数据赋给双精度型变量.在赋值之前,先把整型数据转换成双精度型数据,然后再把它赋给双精度型变量.这种不同类型数据之间的自动转换和赋值,称为赋值兼容.在基类和派生类对象之间也存有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用其子类对象来代替. 下面主要讲积基类和派生类对象之间的赋值兼容1·派生类的对象可以赋值给基类对象. ? ?A a1; //定义基类A对象a1 ? ?B b1; //定义类A的公

C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

1.赋值兼容规则 (1)派生类对象可以给基类对象赋值,这种情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:但是不允许将一个基类的对象赋值给一个派生类. (2)可以将派生类对象的地址赋给基类指针,使基类指针指向派生类对象,通过基类指针引用成员时只可以引用派生类从基类继承而来的成员,而不允许引用派生类的新成员. (3)引用与指针相同. 2.多继承 (1)一个派生类从两个以上的基类中去继承. (2)说明: class 派生类名:继承方式 基类1, 继承方式 基类2,...... {派生类成员

[c++]基类对象作为函数參数(赋值兼容规则)

编程处理教师的基本情况. 要求: 1.定义一个"person"类.用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承"person"类用来存储教师所在学院.所学专业.学历.学位.职称.教龄等,成员函数自定. 3.处理程序,主要包含: ⑴显示姓名.性别.年龄函数:既能显示person对象的姓名.性别.年龄,又能显示teacher对象的姓名.性别.年龄(用person引用对象为形參): ⑵显示教师所在学院.所学

[c++]基类对象作为函数参数(赋值兼容规则)

编程处理教师的基本情况.要求: 1.定义一个"person"类,用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承"person"类用来存储教师所在学院.所学专业.学历.学位.职称.教龄等,成员函数自定. 3.处理程序,主要包括: ⑴显示姓名.性别.年龄函数:既能显示person对象的姓名.性别.年龄,又能显示teacher对象的姓名.性别.年龄(用person引用对象为形参): ⑵显示教师所在学院.所学专