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

时间:2018-09-19 12:37:13

标签: c++ oop downcast upcasting

考虑

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;

在第一种情况下我们该怎么办?

1 个答案:

答案 0 :(得分:1)

此答案的一部分从this stack overflow question撤消。

指针和引用允许后期绑定/运行时多态,而对象将导致对象切片(请参阅@FrançoisAndrieux评论)。

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

这里是一个例子:

#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打印方法被调用,而使用引用(或指针)将导致类Bs方法被调用(在运行时评估正确的类)。 / p>

您的评论“如何做到这一点”向我表明您正在尝试解决一个具体问题。您能代替这个陈述您的确切问题吗?进行这项工作可能不是解决您问题的正确方法。

关于向下转换:据我所知,只有在具有指向派生类对象的基类指针并且您需要对此执行派生类方法时,才应该向下转换。