访问c++派生类的私有成员

Accessing private members of a derived class C++

本文关键字:成员 c++ 派生 访问      更新时间:2023-10-16

我试图通过基类的对象访问派生类的私有成员。下面是我要做的:

 class A {
      private:
           int a, b;
      public:
           A(_a, _b) : a(_a), b(_b) {}
           int getA() { return a; }
           int getB() { return b; }
 };
 class B : public A {
      private:
           int c;
      public:
           B(_a, _b, _c) : A(_a, _b), c(_c) {}
           int getC() { return c; }
 };
 vector<A*> objects;
 A* retVal = new B(1,2,3);
 objects.push_back(retVal);

现在怎么可能访问这个呢?

 objects[0] -> getC();

我有点困惑。

如果您知道对象实际上是B的派生类型,您可以这样做:

static_cast<B*>(objects[0])->getC();

如果你错了,对象实际上不是B类型(或B的子类),你的程序将调用未定义的行为,所以不要这样做

可以在基类中提供纯虚函数

 class A {
      private:
           int a, b;
      public:
           A(_a, _b) : a(_a), b(_b) {}
           int getA() { return a; }
           int getB() { return b; }
           virtual int getC() = 0;
 };
 class B : public A {
      private:
           int c;
      public:
           B(_a, _b, _c) : A(_a, _b), c(_c) {}
           virtual int getC() { return c; }
 };

我看不出有什么干净利落的方法来做你想做的事。我认为这与c++中使用继承的方式是不一致的:如果你的派生类添加了新的方法,那么它真的应该被视为一个新的类型,也就是说,不仅仅是基类型的变形。(你正在尝试做的是更像objective- c的哲学,方法调用是在运行时解决的。)我的建议是重新考虑您的设计,并保持b对象在概念上与a对象分开。