繁体   English   中英

C++ 使用类成员和智能指针获得多态行为

[英]C++ getting polymorphic behavior with class members and smart pointers

我有以下课程设置:

class A {
public:
  virtual void show() { // "show A" }
}

class B : A {
public:
  void show() override { // "show B"}
}

class MainClass {
public:
  MainClass(const A &myA) : myPolymorphicClass(std::make_shared<A>(myA)) {}
  void doShow() {
    myPolymorphicClass.show();
  }

private:
  std::shared_ptr<A> myPolymorphicClass;
}

int main {
   A myA;
   B myB;
   MainClass myAClass(myA);
   myClass.doShow(); // Will print "show A"

   MainClass myBClass(myB);
   myClass.doShow(); // Will also print "show A"
}

我希望调用相应的 show() ,但它不太有效。 我知道这是因为我正在做 A 的 make_shared 将指向 A 的 show() 而不是 B 的,但如果我做 B 的 make_shared 那么我会遇到相反的问题。 我如何设置这个类才能获得我想要的多态行为?

此外,我很确定我可以使用原始指针来实现它,但我真的试图让它与智能指针一起使用。

非常感谢!

你的问题是

MainClass(const A &myA) : myPolymorphicClass(std::make_shared<A>(myA)) {}

在这里,您使用std::make_shared<A>(myA)这意味着无论myA引用什么,您都只会在指针中创建它的A部分,这意味着您将始终调用该函数的A版本因为你所拥有的只是一个A 你需要的是一个模板

template <typename T>
MainClass(const T &myA) : myPolymorphicClass(std::make_shared<T>(myA)) {}

现在您将创建一个指向派生类的指针,并将其存储在myPolymorphicClass 如果你想甚至可以在模板中添加一些 SFINAE 来约束TA派生

template <typename T, std::enable_if_t<std::is_base_of_v<A,T>, bool> = true>
MainClass(const T &myA) : myPolymorphicClass(std::make_shared<T>(myA)) {}

您可以在此实时示例中看到所有这些工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM