首页 > 其他分享 >派生类指针赋值给基类指针

派生类指针赋值给基类指针

时间:2023-01-25 21:08:26浏览次数:50  
标签:cout int 派生类 public pa pd 基类 display 指针


#include <iostream>
using namespace std;
//基类A
class A{
public:
A(int a);
public:
void display();
protected:
int m_a;
};
A::A(int a): m_a(a){ }
void A::display(){
cout<<"Class A: m_a="<<m_a<<endl;

cout<<"A:: &m_a=" <<&m_a<<endl;
}
//中间派生类B
class B: public A{
public:
B(int a, int b);
public:
void display();
protected:
int m_b;
};
B::B(int a, int b): A(a), m_b(b){ }
void B::display(){
cout<<"Class B: m_a="<<m_a<<", m_b="<<m_b<<endl;
cout<<"B:: &m_a=" <<&m_a<<" &m_b="<<&m_b<<endl;
}
//基类C
class C{
public:
C(int c);
public:
void display();
protected:
int m_c;
};
C::C(int c): m_c(c){ }
void C::display(){
cout<<"Class C: m_c="<<m_c<<endl;
cout<<"C:: &m_c=" <<&m_c<<endl;
}
//最终派生类D
class D: public B, public C{
public:
D(int a, int b, int c, int d);
public:
void display();
private:
int m_d;
};
D::D(int a, int b, int c, int d): B(a, b), C(c), m_d(d){ }
void D::display(){
cout<<"Class D: m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<"\n"<<endl;
cout<<"D:: &m_a=" <<&m_a<<" &m_b="<<&m_b<<" &m_c="<<&m_c<<" &m_d="<<&m_d<<endl;
}
int main(){

cout<<"--------初始化四个class----------"<<endl;
A *pa = new A(1);
cout<<"pa="<<pa<<endl;
pa ->display();
cout<<"-----------------------"<<endl;
B *pb = new B(2, 20);
cout<<"pb="<<pb<<endl;
pb ->display();
cout<<"-----------------------"<<endl;
C *pc = new C(3);
cout<<"pc="<<pc<<endl;
pc ->display();
cout<<"-----------------------"<<endl;

D *pd = new D(4, 40, 400, 4000);
cout<<"pd="<<pd<<endl;
pd ->display();
cout<<"-----------------------"<<endl;


cout<<"-----------赋值之后------------"<<endl;

pa = pd;
pa -> display();
cout<<"-----------------------"<<endl;
pb = pd;
pb -> display();
cout<<"-----------------------"<<endl;
pc = pd;
pc -> display();
cout<<"-----------------------"<<endl;
cout<<"pa="<<pa<<endl;
cout<<"pb="<<pb<<endl;
cout<<"pc="<<pc<<endl;
cout<<"pd="<<pd<<endl;
return 0;
}
/home/ledi/.CLion2016.2/system/cmake/generated/neww-a0ddff1d/a0ddff1d/Debug/neww
--------初始化四个class----------
pa=0x559deed7e280
Class A: m_a=1
A:: &m_a=0x559deed7e280
-----------------------
pb=0x559deed7e2a0
Class B: m_a=2, m_b=20
B:: &m_a=0x559deed7e2a0 &m_b=0x559deed7e2a4
-----------------------
pc=0x559deed7e2c0
Class C: m_c=3
C:: &m_c=0x559deed7e2c0
-----------------------
pd=0x559deed7e2e0
Class D: m_a=4, m_b=40, m_c=400, m_d=4000

D:: &m_a=0x559deed7e2e0 &m_b=0x559deed7e2e4 &m_c=0x559deed7e2e8 &m_d=0x559deed7e2ec
-----------------------
-----------赋值之后------------
Class A: m_a=4
A:: &m_a=0x559deed7e2e0
-----------------------
Class B: m_a=4, m_b=40
B:: &m_a=0x559deed7e2e0 &m_b=0x559deed7e2e4
-----------------------
Class C: m_c=400
C:: &m_c=0x559deed7e2e8
-----------------------
pa=0x559deed7e2e0
pb=0x559deed7e2e0
pc=0x559deed7e2e8
pd=0x559deed7e2e0

Process finished with exit code 0

在进行指针赋值之前,我们可以看出

在A 中 pa=&m_a

在B 中pb=&m_a (b继承了A)

在C 中pc=&m_c
在D中 pd=&m_a (D继承了B,C)

A

B

C

D

a

a

a

b

b

c

c

d

pa = pd;
pb = pd;
pc = pd;
之前有说过 将派生类对象赋值给基类对象时,会舍弃派生类新增的成员
将派生类的指针赋值给基类的指针的时候,比如 pa = pd;新增加的对象(bcd)在A中没有对应位置被丢弃,
pa 指向D 的第一个元素a 的地址 &m_a

A

D

a

--------------->

a

b

c

d

pa 指向D 的第一个元素a 的地址 &m_a

B

D

a

--------------->

a

b

b

c

d

pa 指向D 的第三个元素a 的地址 &m_c

C

D

a

b

c

--------------->

c

d

​参考1​

​参考2​


标签:cout,int,派生类,public,pa,pd,基类,display,指针
From: https://blog.51cto.com/u_15202985/6022884

相关文章

  • 函数指针+返回数组指针遇到的坑的记录
    在手熟函数指针时,偷懒用了前面测试返回数组指针写的函数,想着比书上更复杂可以加深理解,没想到碰上很傻的bug还想了半天。1autogetArr3()->int(*)[5]{2intarr......
  • C++指针类型的局部变量初始化
    编译器一般不会对一般变量进行初始化,当然也包括指针。所以负责初始化指针变量的只有程序员自己。使用未初始化的指针是相当危险的。因为指针直接指向内存空间,所以程序员很......
  • C语言:结构体指针
    #include<stdio.h>main(){structsk{inta;floatb;}data,*p;p=&data;data.a=10;printf("%d\n",(*p).a);printf("%d\n",p->a)......
  • C++ 类的成员函数指针
    classdog{intname;public:dog();voidprintname();};dog::dog(){cout<<"dog构造"<<endl;};voiddog::printname(){cout<<"dog"<<endl;......
  • 智能指针
    主要是用来防止new之后忘了delete的,它负责自动释放所指向的对象,智能指针本质上也是一个类动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指......
  • dart win32 字符串指针
    获取窗口标题finalp=malloc<Pointer<Utf16>>(50);//在C语言中其实只需要传入一个字符串的指针就可以了,这里的话,是指针的指针GetWindowText(0x000908A6,p.value......
  • C语言数组和指针传参
    一、数组传参1.一维数组传参一维数组传参时,形参有两种表示方法,1.1.一维数组来接收实参的一维数组首地址(形参的数组在编译器眼里就是一个指针,[]里的数字可写可不写),1.2.一级......
  • C语言指针详解之指针类型
    前言C语言有多种数据类型,如:char(字符型),int(整型),short(短整型),longint(长整型),longlong,float(单精度浮点型),double(双精度浮点型),在这些类型后加上*就表示指针,不同类型表......
  • 【双指针】LeetCode 409. 最长回文串
    题目链接409.最长回文串思路遍历字符串过程中统计字符出现个数,如果达到2则说明可以放到回文串的两端,需要result+=2。遍历完之后的回文串如果长度小于s,说明s中存......
  • 指向类的相关指针
    指向类数据成员的指针定义<数据类型><类名>::*<指针名>赋值&初始化<数据类型><类名>::*<指针名>[=&<类名>::<非静态数据成员>]指向非静态数据成员的指针在定义时必须和类相......