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

C++ C++;使用类成员和智能指针获取多态行为,c++,pointers,inheritance,polymorphism,C++,Pointers,Inheritance,Polymorphism,我有以下课程设置: 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

我有以下课程设置:

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"
}
A类{
公众:
虚拟void show(){/“show A”}
}
B类:A{
公众:
void show()重写{/“show B”}
}
类主类{
公众:
MainClass(const A&myA):myPolymorphicClass(std::make_shared(myA)){}
void doShow(){
myPolymorphicClass.show();
}
私人:
std::共享_ptr myPolymorphicClass;
}
int main{
myA;
B多年电价;
主类myAClass(myA);
myClass.doShow();//将打印“show A”
主类myBClass(myB);
myClass.doShow();//还将打印“show A”
}
我希望调用相应的show(),但它不能正常工作。我知道这是因为我在做A的共享,它会指向A的show()而不是B的show(),但是如果我做了B的共享,那么我会遇到相反的问题。如何设置该类以获得所需的多态行为

另外,我很确定我可以用原始指针来实现这一点,但我真的试图用智能指针来实现这一点

非常感谢

你的问题在于

MainClass(const A &myA) : myPolymorphicClass(std::make_shared<A>(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)) {}

模板原始指针也会有同样的问题。您需要一个虚拟克隆功能。
B;A&ref=b;主要类别m(参考)<代码>克隆
似乎是唯一可行的解决方案。太棒了,这正是我需要的。我没有真正考虑模板有几个原因。1) 我不知道如何将模板类型限制为A的子类。2)我不想在创建MainClass实例时指定模板类型。您的答案解决了这两个问题,尽管使用了SFINAE for#1和#2中发生的明显的模板类型推断。非常感谢!
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)) {}