主页 > 人工智能  > 

C++数据切片问题,Plus多态

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
标签:

C++数据切片问题,Plus多态由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++数据切片问题,Plus多态