我正在尝试访问派生类'私有成员通过基类的对象。这就是我想要做的事情:
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();
我有点困惑。
提前致谢。
答案 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分开。