簡體   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