C++数据切片问题,Plus多态
问题引入:
在C++开发中,数据切片是指当子类对象赋值给父类对象时,父类对象只能接收到子类对象中与父类对象数据成员对应的部分。而子类对象中新增加或修改的数据成员则被丢失,这就是数据切片问题。
1.复用的代码示例
#include <iostream>
class Base
{
public:
Base():BaseNum(1){}
virtual void say(){std::cout << "Base say " << BaseNum << std::endl;}
virtual ~Base(){}
private:
int BaseNum;
};
class Derived :public Base
{
public:
Derived():DerivedNum(2){}
virtual ~Derived(){}
virtual void say(){std::cout << "Derived say " << DerivedNum << std::endl;}
void Special() {std::cout << "Derived Special" << std::endl;}
private:
int DerivedNum;
};
2.数据切片发生场景示例
结果看用子类初始化父类,能力并没有发生变化
父类不能调用子类重写虚函数
父类不能调用子类普通的虚函数
int main()
{
//栈对象,基类仅仅拷贝了派生类的基类
Derived d2;
Base b2 = d2;
b2.say();
return 0;
}
- 输出
Base say 1
3.基类想使用子类重写的虚函数,可以用引用
引用情况下:
父类能调用子类重写虚函数
父类不能调用子类普通的虚函数
int main()
{
//引用对象,基类也可以实现派生类的多态行为
Derived d3;
Base &b3 = d3;
b3.say();
return 0;
}
- 输出
Derived say 2
4.对象创建在堆,基类指针可以调用派生类重写的虚函数
int main()
{
//指针访问对象可以获得多态行为
Derived* d1 = new Derived();
Base* b1 = new Derived();
b1->say();
delete d1;
delete b1;
return 0;
}
- 输出
Derived say 2
5.完整代码
int main()
{
//指针访问对象可以获得多态行为
Derived* d1 = new Derived();
Base* b1 = new Derived();
b1->say();
delete d1;
delete b1;
std::cout << "end.........................................1\n" << std::endl;
//栈对象,基类仅仅拷贝了派生类的基类
Derived d2;
Base b2 = d2;
b2.say();
std::cout << "end.........................................2\n" << std::endl;
//引用对象,基类也可以实现派生类的多态行为
Derived d3;
Base &b3 = d3;
b3.say();
std::cout << "end.........................................3" << std::endl;
return 0;
}
- 输出
Derived say 2
end.........................................1
Base say 1
end.........................................2
Derived say 2
end.........................................3