测试多态性&虚函数&共享指针,我试图理解以下最小示例描述的情况。
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
,或者至少在最后一行调用了B
的someBMethod
。问题是:应该如何正确初始化Member
,以便调用C
的someBMethod
方法?
Member(std::make_shared<B>(SomeB))
通过隐式的B(const B&)
拷贝构造函数创建了一个新的B
实例,该实例与原始的C
实例没有任何关系。 - Piotr Skotnickistd::make_shared<B>
明确表示“构建一个 B 类型的实例”,而不是“构建一个与SomeB
相同类型的实例,然后将其向上转换并存储在我的 shared_ptr 中”。 - Piotr SkotnickiA
拥有一个指向B
的成员,但我可以将任何派生自B
的类放在那里并调用其方法(派生类的方法)。 - Kae