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)) {}