易采站长站为您分析C++中基类和派生类之间的转换,有助于深入理解C++面向对象程序设计,需要的朋友可以参考下
本文实例讲解了C++中基类和派生类之间的转换。对于深入理解C++面向对象程序设计有一定的帮助作用。此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公有继承,关键字public。具体分析如下:
以下程序为讲解示例:
#include<iostream>
using namespace std;
class A
{
public:
A(int m1, int n1):m(m1), n(n1){}
void display();
private:
int m;
int n;
};
void A::display()
{
cout << "m = " << m << endl;
cout << "n = " << n << endl;
}
class B :public A
{
public:
B(int m1, int n1, int p1) :A(m1, n1), p(p1){}
void display();
private:
int p;
};
void B::display()
{
A::display();
cout << "p = " << p << endl;
}
void print1(A& a)
{
a.display();
}
void print2(B& b)
{
b.display();
}
void print3(A a)
{
a.display();
}
void print4(B b)
{
b.display();
}
int main()
{
A a(3, 4);
// a.display();
B b(10, 20, 30);
// b.display();
A * pa;
B * pb;
pa = &a;
// pa->display();
pb = &b;
// pb->display();
// pa = &b;
// pa->display();
// pb = &a; //错误。派生类指针不能指向基类对象。
// print1(b);
// print2(a); //错误。不能用基类对象给派生类引用赋值。
// print3(b);
// print4(a); //错误。不能用基类对象给派生类对象赋值。
// pb = pa; //不能用基类指针给派生类指针赋值。
pb = (B*)pa; //可以强制转换,但是非常不安全。
pb->display(); //出现安全问题,p无法访问,因为a中没有p成员
system("pause");
return 0;
}
切记:派生类对象是基类对象,派生类中包含有基类的成员。基类对象不是派生类对象,它不能包含派生类型的成员。
一、派生类到基类的转化
1.派生类对象地址赋值给基类指针
main函数中执行以下代码
A a(3, 4);
// a.display();
B b(10, 20, 30);
// b.display();
A * pa;
// B * pb;
// pa = &a;
// pa->display();
// pb = &b;
// pb->display();
pa = &b;
pa->display(); //会输出 10 20
pa为基类指针,指向派生类对象是合法的,因为派生类对象也是基类对象。语句会输出派生类对象中基类部分。
注意:这里并不会调用派生类的display函数,调用的是基类的display函数,因为指针pa是基类指针,编译器在编译阶段只知道pa的类型。如果要实现调用派生类的display函数,需要用到虚函数实现多态性。之后的文章会讲到。










