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

时间:2014-05-25 08:19:24

标签: c++ inheritance polymorphism member derived-class

我正在尝试访问派生类'私有成员通过基类的对象。这就是我想要做的事情:

 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();

我有点困惑。

提前致谢。

3 个答案:

答案 0 :(得分:1)

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

 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; }

 };

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我没有看到任何干净的方式来做你想要的。我认为它与在c ++中使用继承的方式不一致:如果你的派生类添加了新方法,那么它应该被视为一种新类型,即不仅仅是基类型的变形。 (你要做的是更客观的C式哲学,其中方法调用是运行时解析的。) 我的建议是重新考虑你的设计,并将B-object概念上与A-objects分开。