[英]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 来约束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)) {}
您可以在此实时示例中看到所有这些工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.