【发布时间】:2014-10-08 16:01:49
【问题描述】:
测试多态性&虚函数&shared_ptr,我试图理解以下最小示例所描述的情况。
class B{
public:
// Definition of class B
virtual void someBMethod(){
// Make a burger
};
};
class C : public B {
public:
// Definition of class C
void someBMethod(){
// Make a pizza
};
};
class A{
public:
A(B& SomeB) : Member(std::make_shared<B>(SomeB)){};
std::shared_ptr<B> Member;
};
现在,大体上我们可以拥有
int main(){
C SomeC;
A SomeA(SomeC);
A.Member->someBMethod(); // someBMethod from B is being executed.
};
除非我没有从我的实际代码到最小示例中包含一些错误,否则我认为 SomeC 正在被削减为 B,或者至少 someBMethod 从 B 被最后调用线。
问题:什么是初始化Member 的正确方法应该是调用C 中的方法someBMethod?
【问题讨论】:
-
Member(std::make_shared<B>(SomeB))通过隐式B(const B&)复制构造函数创建B的新实例,该实例与原始C实例无关 -
谢谢@PiotrS。你知道我的问题的答案吗?即初始化..的正确方法是什么?
-
你的目标是什么?
std::make_shared<B>明确表示“构建 B 的实例”,而不是“构建一些与SomeB完全相同类型的实例,然后将其转换并存储在我的 shared_ptr 中” -
@PiotrS。我的目标是让
A类拥有一个指向B的成员,但我可以将B的任何派生类放在那里并调用它的方法(派生类的方法)。
标签: c++ polymorphism shared-ptr