我有以下课程设置:
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)) {}