gpt4 book ai didi

c++ - 在 C++ 中将基类分配给派生类,反之亦然,以及静态对象和动态对象之间的区别

转载 作者:行者123 更新时间:2023-11-28 04:32:54 25 4
gpt4 key购买 nike

考虑

class base { }

class derived: public base {}

有什么区别:

第一个案例:

int main() {
base b;
derived d;
}

第二种情况:

int main() {
base *b;
derived *d;
}

如果我们在第二种情况下像这样向下转型和向上转型:

  // upcast - implicit type cast allowed
Base *b= &d;

// downcast - explicit type case required
Derived *d= (Dervied *) &b;

第一种情况怎么办?

最佳答案

部分答案摘自 this stack overflow question .

指针和引用允许后期绑定(bind)/运行时多态性,而对象会导致对象切片(参见@François Andrieux 评论)。

此对象切片会导致什么结果:如果您直接使用对象,您将丢失信息并且可能会调用错误的方法,即使您使用虚拟方法也是如此。

这是一个例子:

#include <iostream>
using namespace std;

class A
{
public : virtual void print(void)
{
cout<< "A::print()"<<endl;
}
};
class B : public A
{
public : virtual void print(void)
{
cout<<"B::print()"<<endl;
}
};

int main(void)
{
A a;
B b;
A& ref = b;

a=b;
a.print();
ref.print();
return 0;
}

B 类派生自 A。A a = b; 将导致调用 As 类打印方法,而使用引用(或指针)将导致调用 B 类方法(正确的类在运行时评估)。

您对“如何制作”的评论向我表明您正在尝试解决一个具体问题。你能说出你的确切问题而不是这个吗?完成这项工作可能不是解决您问题的正确方法。

关于向下转型:据我所知,只有当你有一个指向派生类对象的基类指针并且你需要对此执行派生类方法时,你才应该向下转型,然后答案是 dynamic_cast。

关于c++ - 在 C++ 中将基类分配给派生类,反之亦然,以及静态对象和动态对象之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52406047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com