C++(13)——虚基类和C++四种类型转换

继承方式

1、单继承(一个派生类只有一个直接基类)
2、多继承(派生类有两个或以上的直接基类)
3、菱形继承

虚基类

virtual修饰成员方法时叫虚函数,virtual修饰修饰继承方式时叫虚继承。

class A
{
public:
private:
	int ma;
};
class B:virtual public A**加粗样式**
{
public:
private:
	int mb;
};

有虚基类的内存存储:
当有虚继承的时候,基类的数据放到代码的最后面,在派生类数据前面加一个指向虚基类表的vbptr,第一个数据为0 地位个数据为派生类对象中基类数据的位置
在这里插入图片描述
基类指针指向派生类对象,永远都指向的是积累部分数据的其实位置
(面试坑)所以用基类指针指向new出来的派生类的时候,我们delete会出现错误
在这里插入图片描述

菱形继承

当一个派生类的两个父类都是由同一个类派生出来的时候,在定义类的时候会发生二义性(内存中会有两份爷爷类)

class A
{
public:
	A(int data) :ma(data) { cout << "A()" << endl;}
	~A() { cout << "~A()" << endl; }
protected:
	int ma;
};
class B :virtual public A
{
public:
	B(int data) :A(data),mb(data) { cout << "B()" << endl; }
	~B() { cout << "~B()" << endl; }
protected:
	int mb;
};
class C : virtual public A
{
public:
	C(int data) :A(data), mc(data) { cout << "C()" << endl; }
	~C() { cout << "~C()" << endl; }
protected:
	int mc;
};
class D :public B,public C
{
public:
	D(int data) :A(data),B(data), C(data),md(data) { cout << "B()" << endl; }
	D(int data) : B(data), C(data), md(data) { cout << "B()" << endl; }
protected:
	int md;
};
int main()
{
	D d(10);
	return 0;
}


上述代码就是菱形继承的一个典型例子,A中的数据在类D中只有一份

C++语言级别提供的四种类型转换方式

c++语言级别提供的四种类型转换方式
const_cast:去掉常量属性的类型转换,<>尖括号内必须时指针或者引用
static_cast:提供编译器认为安全的类型转换(没有任何联系的类型之间的转换被否定),他是编译时期的类型转换
reinterpret_cast:类似于C风格的强制类型转换
dynamic_cast:主要用在继承结构中,可以支持RTTI类型识别的上下转换(运行时期的类型转换)

class Base
{
public:
	virtual void func() = 0;

};
class Derive1 : public Base
{
public:
	void func()
	{
		cout << "call Derive1::func" << endl;
	}
};
class Derive2 : public Base
{
public:
	void func()
	{
		cout << "call Derive2::func" << endl;
	}	
	void derive02func()
	{
		cout << "call Derive2::derive02func" << endl;
	}
};
void showfunc(Base *p)
{
	//dunamic_cast会检查p指针是否指向的是一个Derive2类型的对象
	//如果是,dynamic_cast转换类型成功,返回Derive2对象的地址给pd2,否则返回nullptr
	Derive2 *pd2 = dynamic_cast<Derive2*>(p);
	if (pd2 == nullptr)
	{
		pd2->derive02func();
	}
	else
	{
		p->func();
	}
}
int main()
{
	Derive1 d1;
	Derive2 d2;
	showfunc(&d1);
	showfunc(&d2);
	//const_cast
	//const int a = 10;
	//int *p1 = (int *)&a;

	int *p2 = const_cast<int *>(&a);
	//char *p2 = const_cast<int *>(&a);编译错误
	//转换不能转换为指针类型不匹配的另外一个类型的指针

	//static_cast 基类类型《==》派生类类型 可以用static_cast转换(上行转换)   如果需要强制转换则使用reinterpret_cast强制转换
	int a = 10;
	char b = static_cast<int>(a);
	
	int *p = nullptr;
	//short *b = static_cast<short*>(p);错误
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值