建设网站企业,做外贸仿牌都用哪些网站,自己的品牌怎么推广加盟,个性化网站建设报价概念 上行转换#xff1a;把派生类的指针或引用转换成基类表示#xff0c;简单来说就是子类指向父类 下行转换#xff1a;把基类指针或引用转换成派生类表示#xff0c;简单来说就是父类指向子类
上行转换是安全的的#xff0c;下行转换是不安全的#xff08;最好使用…概念 上行转换把派生类的指针或引用转换成基类表示简单来说就是子类指向父类 下行转换把基类指针或引用转换成派生类表示简单来说就是父类指向子类
上行转换是安全的的下行转换是不安全的最好使用 dynamic_cast 具体参考: xxx_cast 区别
这里我们主要讨论上行转换也就是派生类指针赋值给基类指针下行转换可以参考上面那个链接 dynamic_cast 下行转换
先说结论基类函数为虚函数和非虚函数情况不一样下面分别进行讨论
非虚函数
参考https://blog.csdn.net/ENSHADOWER/article/details/96638232
注意
编译器通过指针来访问成员变量指针指向哪个对象就使用哪个对象的数据编译器通过指针的类型来访问成员函数指针属于哪个类的类型就使用哪个类的函数。
虚函数
如果将 其中 的基类 A 的 display 函数改为虚函数代码如下
#include iostream
using namespace std;//基类A
class A {
public:A(int a);
public:virtual void display();
protected:int m_a;
};
A::A(int a) : m_a(a) { }
void A::display() {cout Class 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;
}//基类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;
}//最终派生类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 endl;
}int main() {A *pa new A(1);B *pb new B(2, 20);C *pc new C(3);D *pd new D(4, 40, 400, 4000);cout -------更改前----- endl;pa-display();pb-display();pc-display();pd-display();cout ----------------------- endl;cout --------更改后----------- endl;pa pd;pa-display();pb pd;pb-display();pc pd;pc-display();pd-display();cout ----------------------- endl;system(pause);return 0;
}最终输出结果为
-------更改前-----
Class A: m_a1
Class B: m_a2, m_b20
Class C: m_c3
Class D: m_a4, m_b40, m_c400, m_d4000
-----------------------
--------更改后-----------
Class D: m_a4, m_b40, m_c400, m_d4000
Class D: m_a4, m_b40, m_c400, m_d4000
Class C: m_c400
Class D: m_a4, m_b40, m_c400, m_d4000注意
class A 的 display 函数是虚函数更改指向之后pa pb 调用的都是派生类的 display 函数成员变量也就是相应派生类的由于 class C 的 display 函数不是虚函数所以更改指向之后pc 依旧调用的是自身的 display 函数但是成员变量 m_c 是派生类的
具体分析可以参考上面的链接
参考
https://blog.csdn.net/ENSHADOWER/article/details/96638232
最后附一份我整理的 CPP 面试相关知识点
https://github.com/EricPengShuai/Interview 如果觉得不错的话可以 ⭐️ 一下