[C ++通过类成员和智能指针获得多态行为

问题描述 投票:0回答:1

我有以下课程设置:

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,那么我将遇到相反的问题。如何设置此类,以便获得所需的多态行为?

此外,我很确定我可以使用原始指针来实现此功能,但是我实际上是在尝试使其与智能指针一起使用。

非常感谢!

c++ pointers inheritance polymorphism
1个回答
0
投票

您的问题是与

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,以将T约束为从A派生,例如

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)) {}
© www.soinside.com 2019 - 2024. All rights reserved.