我们常用基类指针指向派生类对象来实现多态性。

私有继承不允许基类指针指向派生类

基类指针只能访问到基类中含有的公有成员

当用基类指针指向派生类对象在动态分配堆上内存的时候,析构函数必须是虚函数!

成员如果是数据成员的话访问的是基类的版本(如果派生类中含有相同名字的数据成员的话)。
对于已经被重写的方法成员(如果没有重写则没有什么问题),如果方法成员没有用virtual修饰的话访问的仍然是基类的方法,其他方法对基类方法的调用仍然是基类的方法。如果用virtual修饰以后访问的就是派生类的方法。并且基类的方法修改的是基类的数据成员,如果派生类中含有相同名字的数据成员是不会被修改的。

如果将该指针赋给一个对象,那么多态的性质将消失。

例如:

#include <iostream>
using namespace std;
class A
{public:int t;A() { cout << "A::A() called.\n"; }virtual ~A() { cout << "A::~A() called.\n"; }virtual void Print(){printf("A:Hello world!\n");}virtual void Set(){t = 1;}
};
class B :public A
{public:int t;B(int i){cout << "B::B() called.\n";buf = new char[i];}void Print(){printf("B:Hello world!\n");}void Eat(){printf("B:eat\n");}virtual ~B(){delete[]buf;cout << "B::~B() called.\n";}void Set(){t = -1;}
private:char* buf;
};
void fun(A* a)
{cout << "May you succeed!\n";delete a;
}
int main()
{A* a = new B(15); a->Set();printf("t=%d\n", a->t);a->Print(); fun(a);printf("test\n");return 0;
}

运行结果:


参考资料:

传送门

C++基类指针指向派生类(指针)相关推荐

  1. C++的基类指针指向派生类对象,vector实现多态性

    添加问题: 练手创建一个表示各种不同包裹的继承层次. 在写代码时:要求vector来实现多态性 , 用基类指针变量指向子类对象. 前面的父类和子类定义: //创建一个表示各种不同包裹的继承层次 #in ...

  2. 【C++】【读个小故事就弄懂】为什么基类指针可以指向派生类对象,而派生类指针却不可以指向基类对象?(最易懂最有趣最生动的举例)

        在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间.     当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素.     于是基类的指针就可 ...

  3. 指向派生类对象的基类指针与虚函数

    看如下代码: CSales   aSales("崔贤"); CSales* pSales; CWage* pWager; pSales=&aSales; pWager=&a ...

  4. C++>继承,继承方式及其比较,子类和父类对象指针,派生类的默认成员函数,虚继承,继承与友元,继承与静态成员

    继承 继承的概念与定义 概念: 继承是指一个子类(或称为派生类)继承父类(或称为基类)的特征(属性和操作).继承是面向对象程序设计时实现代码复用的重要手段,它允许在原有的类的基础上进行扩展,增加功能, ...

  5. 基类对象与派生类对象的关系

    点击打开原文链接 基类对象与派生类对象的使用关系 1. 派生类对象作为基类对象处理 由于派生类具有所有基类的成员,所以把派生类的对象赋给基类对象是合理的,不过要求这种继承方式必须是public方式.但 ...

  6. 非多态的继承情况下,基类指针可以指向派生类对象么?

    class Base { // 基类 public:Base(int aa=88) : a(aa) {}void f() { // 非virtualcout<<"Base&quo ...

  7. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

  8. 基类数组存放派生类_永远不要将派生类数组赋值给基类类型指针

    C.152: Never assign a pointer to an array of derived class objects to a pointer to its base C.152:永远 ...

  9. 虚函数之定义一个基类Shape,在此基础上派生出Rectangle和Circle再使用Rectangle类创建一个派生类Square。

    定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea( )函数计算对象的面积,再使用Rectangle类创建一个派生类Square.将getArea()改造 ...

最新文章

  1. 关于HttpClient上传中文乱码的解决办法
  2. LSD-SLAM 编译过程(Ubuntu 14.04 + ROS Indigo
  3. 百度API地图的标注不居中显示,而显示在左上角
  4. scala的传值参数和传名参数
  5. 通过Apache Kafka集成流式传输大数据
  6. 软件开发实训需要用到的算法和结构_软件开发实习个人总结
  7. m1 MBA配置TeX+Sublime+Skim环境
  8. Sqoop-MySQL导入hive时id为文本解决
  9. C++请不要问我string s=”a”+”b”分配了几次内存
  10. linux svn服务的维护,Linux服务器搭建svn环境方法详解_网站服务器运行维护,Linux,svn...
  11. 现代计算机的存储体系 (转载)
  12. 双三次插值matlab代码
  13. 【愚公系列】2022年04月 微信小程序-image图片
  14. An assembly specified in the application dependencies manifest
  15. [语音识别] 单音素、三音素、决策树
  16. linux-vimdiff,diff,patch,cmp:文件比较
  17. TEE OS中断篇(五):FIQ的事件处理
  18. VR线上虚拟展厅,为企业带来的优势:
  19. ReentrantReadWriteLock原理与使用
  20. zynq7000 学习(二十四)VGA 接口原理分析和控制逻辑的实现学习

热门文章

  1. Illustrator、Indesign与Photoshop
  2. 利用 dbghelp.dll 生成 dump 文件
  3. ORDER BY NEWID()【原创】
  4. linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?
  5. python运行原理_Python线程池及其原理和使用(超级详细)
  6. 组态王 6.55 启停plc_永宏PLC在远程控制系统中的应用
  7. coreos 安装mysql_CoreOS 在 PC 上快速安装方法指南
  8. ubantu下安装Nginx
  9. C语言开发笔记(五)字符串常量
  10. STM32F1笔记(二)GPIO输入