[英]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.