使用数组的对象的编译时多态性可能吗?

时间:2019-04-04 06:31:46

标签: c++ polymorphism compile-time

我仍在学习,但我有一个问题希望我能帮助我:

是否有可能在不使用虚函数的情况下实现从同一基类继承来的不同类的编译时多态性,而这些基类将在数组中使用?

任何人都知道C ++的OOP,如果您有类似的东西

allowedMethods

我们知道这是可行的,因为功能是并且继承在运行时已解决。但是我所知道的是如何在没有虚拟功能的情况下执行此操作,或者是否有可能在不使用虚拟功能的情况下执行同一操作?

假设您做这样的事情

/api/guest/v1/restApi/save

因此,有很多选择,但是我似乎找不到与我想要的行为相同的东西。我读到的一种解决方案是制作一个静态类模板,其工作方式类似于

class Base {
public:
   virtual void foo (){
    std::cout << "I'm the base" << std::endl;
   }
}

class A : public Base {
public:
  void foo() {
   std::cout << "I'm the child" << std::endl;
  }
} 

class B : public Base {
public:
  void foo() {
   std::cout << "I'm the child #2" << std::endl;
  }
} 


//Assume some main here

A *a = new A();
B *b = new B();

Base *someArray[] = {a,b};

someArray[0]->foo(); //"I'm the child"
someArray[1]->foo(); //"I'm the child #2"

以上不是我想要的行为。然后是静态转换,这似乎很有希望,但是我需要知道在任何给定时间它将要进入哪个类,这不是我想要的行为。

class Base {
public:
   void foo (){
    std::cout << "I'm the base" << std::endl;
   }
}

class A : public Base {
public:
  void foo() {
   std::cout << "I'm the child" << std::endl;
  }
} 

class B : public Base {
public:
  void foo() {
   std::cout << "I'm the child #2" << std::endl;
  }
} 


//Assume some main here

A *a = new A();
B *b = new B();

Base *someArray[] = {a,b};

someArray[0]->foo(); //"I'm the base"
someArray[1]->foo(); //"I'm the base"

这与我想要的非常接近,但是我的问题是要使static_cast正常工作,我需要知道我要在静态情况下使用哪个类,而不是我想要的行为。

您怎么看?有什么更好的方法来做我想要的吗?

感谢阅读,如果对我的要求有任何疑问,请告诉我,以便澄清。

1 个答案:

答案 0 :(得分:0)

在编译时没有真正的方法可以完成您想要的事情。仅仅是因为您希望您的行为取决于运行时对象的类型。

C ++通过多态性(即虚函数)和RTTI(如果需要)来提供运行时类型相关的行为。如果您不想使用这种“自然方式”,则可以使用以下替代方法:

  • 您知道编译时对象的类型(例如,如果您确定第一个元素始终为A*,第二个元素始终为B*):在这种情况下,您可以像在第三种情况下一样使用static_cast,或使用模板代码(例如,如果您更喜欢compile-time policies而不是run-time strategies)。但这通常不是处理容器中随机对象的方法。
  • 您可以找出对象的类型并推断出相应的调用函数:一种典型的实现方法是在基类中具有一个键入字段,并使用它与{{1} }。但这不是最佳实践。并且添加您自己的类似RTTI的功能而不是使用编译器的优化功能不会比多态有效。
  • 您可以使用std::variantstd::any:这些方法提供了使用编译时功能提供某种与运行时相关的行为的可能性(而不必要求从中派生替代类型)一个共同的基础)。

剩下的问题是为什么您需要避免正常的多态性。