C++ 在C+中的派生类之间切换+;

C++ 在C+中的派生类之间切换+;,c++,inheritance,C++,Inheritance,这是我能找到的最接近真实的东西。然而,答案仍然给我留下了疑问 下面是一个代码示例: class A { A() {} virtual void print() = 0; } class B : public A { B() {} void print() { printf("B"); } } class C : public A { C() {} void print() { printf("C"); } } int main() { A** n;

这是我能找到的最接近真实的东西。然而,答案仍然给我留下了疑问

下面是一个代码示例:

class A {
   A() {}
   virtual void print() = 0;
}

class B : public A {
   B() {}
   void print() { printf("B"); }
}

class C : public A {
   C() {}
   void print() { printf("C"); }
}

int main() {
   A** n;

   n = new A*[4];
   n[0] = new B;
   n[1] = new C;
   n[2] = new B;
   n[3] = new C;

   for(int i = 0; i < 4; i++)
      n[i]->print();
   printf("\n");

   delete n[0];
   delete n[1];
   delete n[2];
   delete n[3];
   delete [] n;
}
因此,当您打印出阵列时,您现在可以得到“BCCC”。我在链接的帖子中读到,必须这样做是设计拙劣的证据。如果是这样的话,可以解释一下吗?对我来说,这似乎是一个面向对象设计的常见用例。假设所有属性都在基类中定义。类的唯一区别在于方法的实现


如果C++不支持在运行时改变这样的对象类型,那么获得相似结果的方法是什么?

< P>指针指向的对象<代码> N[2 ] < /C> >是<代码> B< /Cord>对象。它不能神奇地变成
C
对象。如果你想要一个
C
对象,你必须创建一个。但是,不要忘记删除现有的
B
对象

delete n[2];
n[2] = new C;

我不相信你可以从B类转换到C类。这两个类也是A类,因为在B中是A,C是A,但是B不是C,C不是B。两者都可以转换到A中,但由于切片问题,这是一种危险的做法。在这种情况下,通过强制转换,派生类中没有要丢失的数据,因此不会丢失任何东西。但是,为了调用父类方法,不需要将B或C强制转换为a


也许可以编写一个以B对象作为输入并返回C对象的函数,以及一个以C对象并返回B对象的函数,但您必须自己手动将一个对象转换为另一个对象

最接近的方法是在B和C构造函数中实现,该构造函数将接受A(或A*)作为输入,并将所需的任何数据复制到新对象中。那么你应该得到这样的东西

A* temp = n[2];  
n[2] = new C(A);  
delete temp;  
但更好的解决方案是创建一个包含数据的类和一个*指向一个实现不同数据操作方式的类。

一旦创建了对象,就不能真正更改对象的类型。但这并不意味着不能在运行时更改行为。你需要做的是重构你的代码

class A;

class ImplA
{
public:
  void print (A&) = 0;
};

class A
{
  std::unique_ptr<ImplA> impl;

public:
  A (ImplA* ia) : impl(ia)
  {}

  void print()
  {
    impl->print(*this);
  }

  void changeImpl (ImplA* ia)
  {
    impl.reset(ia);
  }
};
A类;
类ImplA
{
公众:
无效打印(A&)=0;
};
甲级
{
std::唯一的\u ptr impl;
公众:
A(ImplA*ia):impl(ia)
{}
作废打印()
{
执行->打印(*此);
}
无效变更通知(通知*ia)
{
执行复位(ia);
}
};
这当然是使用C++11的智能指针,但不管怎样,想法都是一样的。你应用软件工程的基本原理:抽象改变的事物


我建议你仔细阅读设计模式。它将在不破坏OOP工作方式的情况下为您提供一些想法,让您可以做您想做的事情。

C++不支持在运行时更改对象类型。当对象被扭曲时,它将被修复。@PlasmaHH:n[i]是指针。我们不能使用子指针指向父指针吗?
class A;

class ImplA
{
public:
  void print (A&) = 0;
};

class A
{
  std::unique_ptr<ImplA> impl;

public:
  A (ImplA* ia) : impl(ia)
  {}

  void print()
  {
    impl->print(*this);
  }

  void changeImpl (ImplA* ia)
  {
    impl.reset(ia);
  }
};