嵌套类、继承和C++中的共享指针

Nested classes, inheritance and shared pointers in C++

本文关键字:共享 指针 C++ 继承 嵌套      更新时间:2023-10-16

下面的程序显然在返回表达式中失败了:

#include <memory>
class Base {
public:
class Nested {
public:
int c;
};
};
class A : public Base {
public:
class Nested : public Base::Nested {
public:
int c = 1;
};
};
class B : public Base {
public:
class Nested : public Base::Nested {
public:
int c = 2;
};
};
int main() {
std::shared_ptr<Base> X = std::make_shared<A>();
return X::Nested.c;
};

如何获取 X 的Nested.c值?

换句话说,我有一个基类(Base(和两个派生类(AB(。每个派生类都有一个嵌套类(嵌套(。我想从实例X调用Nested.c,该实例被动态选择为派生类之一。

可能只是对嵌套类的误解。嵌套类不会神奇地将成员添加到其父类。您需要手动执行此操作,例如:

class Base {
public:
class Nested {
public:
int c;
};
Nested nested; // member of nested class Base::Nested.
};

请记住,Base::NestedA::NestedB::Nested都是不同的类。虽然它们看起来很相似,但它们根本没有关系。


也许以下是您想要的:
#include <memory>
class Base {
private:
class Nested {
public:
int c;
};
Nested nested; // member of nested class Base::Nested.
public:
virtual int getC() const { return this->nested.c; }
};
class A : public Base {
private:
class Nested {
public:
int c = 1;
};
Nested nested; // member of nested class A::Nested.
public:
int getC() const override { return this->nested.c; }
};
class B : public Base {
private:
class Nested {
public:
int c = 2;
};
Nested nested; // member of nested class B::Nested.
public:
int getC() const override { return this->nested.c; }
};
int main() {
std::shared_ptr<Base> X = std::make_shared<B>();
return (*X).getC();
};

每个类都有自己的嵌套类的成员,并使用虚拟 getter 返回c