基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址

文章目录

基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类起始地址。

代码

cpp 复制代码
#include <iostream>
using namespace std;

class base
{
public:
	void show() { cout << "base:: show"; }
};

class derive:public base
{
public:
	virtual void show() { cout << "derive:: show"; }
};

int main()
{
	base* p = new derive;
	p->show();
	delete p;
}

以上代码在调用delete 的时候出错,因为在调用deletes时传入的地址和我么预想的不一样,才会导致软件崩溃

代码2

cpp 复制代码
#include <iostream>
using namespace std;

class base
{
public:
	void show() { cout << "base:: show"<<endl; }
	void operator delete(void *p)
	{
		cout << "operator delete p" <<p<< endl;
		free(p);
	}
};

class derive:public base
{
public:
	virtual void show() { cout << "derive:: show"; }
	void* operator new (size_t size)
	{
		void* p = malloc(size);
		cout << "operator new " << p << endl;
		return p;
	}
};

int main()
{
	base* p = new derive;
	p->show();
	delete p;
}

综上,子类带虚函数,而基类不带虚函数是一件非常危险的操作,编译器对指针的指向超出我们的预期,往往导致很难排查的问题

相关推荐
皓月斯语1 小时前
B2132 素数对
c++·算法·题解
星轨初途2 小时前
LeetCode 热题 100——day2 字母异位词分组
c++·算法·leetcode
笨鸟先飞的橘猫2 小时前
c++面向对象编程
开发语言·c++
啦啦啦啦啦zzzz3 小时前
设计模式:桥接模式和组合模式
c++·设计模式·组合模式·桥接模式
-森屿安年-3 小时前
647. 回文子串
c++·算法·动态规划
fpcc3 小时前
c++应用网络编程之十七WebSocket
网络·c++·websocket
haolin123.3 小时前
类和对象(下)
c语言·开发语言·c++
皓月斯语3 小时前
P5736 【深基7.例2】质数筛
c++·算法·题解
鸿芯微控科技4 小时前
MFC质量流量控制器流量不准怎么排查?设定值、反馈值与参考流量对比,附Python代码
c++·python·mfc
拂拉氏4 小时前
【知识讲解】 让指针拥有“自我意识”?--C++智能指针相关内容讲解
c++·智能指针