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

C++ 访问派生类C+的私有成员+;,c++,inheritance,polymorphism,member,derived-class,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:

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

 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);
我有点困惑


提前感谢。

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

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

 };

如果您知道对象实际上是派生类型
B
,则可以执行以下操作:

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

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

我看不到任何干净的方法来做你想做的事情。我认为这与继承在c++中的使用方式不一致:如果派生类添加了新方法,那么它实际上应该被视为一种新类型,即不仅仅是基类型的变形。(您尝试的是更客观的C语言哲学,方法调用在运行时得到解决。)
我的建议是重新考虑您的设计,并在概念上保持B对象与A对象的分离。

如果您确定向量中的对象是“B”实例,则可以将行
int getA(){return A;}
应为
int getA()const{return A;}
我尝试强制转换它,但仍然得到相同的错误:类a没有成员cBTW,
virtual~a()
丢失。我还有其他派生类。我认为这是行不通的。还有别的办法吗?@user3279394“还有别的办法吗?”不是简单直接的方式。可能继承不是解决实际用例的正确工具。在不知道的情况下很难给你建议。也可以使用
dynamic_cast
nullptr
检查来确定实际的派生类是什么。
static_cast<B*>(objects[0])->getC();